TList实现的任务队列
TList实现的任务队列
var
g_tasks: TList;
type
PTRecvPack = ^TRecvPack;
TRecvPack = record // 接收到的原数据
socket: TCustomWinSocket;
data: AnsiString;
end;
procedure TForm1.ssocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
Pack: AnsiString;
pRecvPack: PTRecvPack;
begin
try
// 接收数据
FData := FData + Socket.ReceiveText;
// 处理粘包
while Pos(TAILCHAR, FData) > 0 do
begin
// 取一个完整的数据包
FData := ArrestStringEx(FData, HEADCHAR, TAILCHAR, Pack);
// 加入任务队列
New(pRecvPack);
pRecvPack^.socket := Socket;
pRecvPack^.data := Pack;
g_tasks.Add(pRecvPack);
end;
except
on e: Exception do
WriteLog('TForm1.ssocketClientRead ' + e.Message);
end;
end;
procedure TWorkerThread.Execute;
var
pRecvPack: PTRecvPack;
pDecodePack: PTDecodePack;
len: Integer;
begin
inherited;
try
while not Self.Terminated do
begin
Sleep(1);
// 取一个数据包 从队列
g_tasks.Lock;
try
if g_tasks.Count = 0 then
Continue;
pRecvPack := g_tasks.Items[0];
g_tasks.Delete(0);
finally
g_tasks.UnLock;
end;
// 开始解码
New(pDecodePack);
pDecodePack^.socket := pRecvPack^.socket;
// 解码包头
pDecodePack^.msgHead := DecodeMessage(LeftStr(pRecvPack^.data, DEFBLOCKSIZE));
// 解码包体 如有
len := Length(pRecvPack^.data);
if len > DEFBLOCKSIZE then
pDecodePack^.msgBody := DecodeString(RightStr(pRecvPack^.data, len - DEFBLOCKSIZE));
// 释放指针
if pRecvPack <> nil then
Dispose(pRecvPack);
// 处理消息 开始
case pDecodePack^.msgHead.MsgID of
CM_LOGIN:
Self.login(pDecodePack);
CM_PASSWORD:
Self.password(pDecodePack);
CM_CTOC:
Self.cToc(pDecodePack);
// CM_QRY:
end;
// 释放指针
if pDecodePack <> nil then
Dispose(pDecodePack);
end;
except
on e: Exception do
WriteLog('TWorkerThread.Execute ' + e.Message);
end;
end;
TList实现的任务队列的更多相关文章
- 异步任务队列Celery在Django中的使用
前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...
- 通过IEnumerable和IDisposable实现可暂停和取消的任务队列
一般来说,软件中总会有一些长时间的操作,这类操作包括下载文件,转储数据库,或者处理复杂的运算. 一种处理做法是,在主界面上提示正在操作中,有进度条,其他部分不可用.这里带来很大的问题, 使用者不知道到 ...
- Tlist删除技巧
二. 从TList开始分析-- 为了写一个更好的性能ISAPI Filter,我需要更快速地从TList中删除部分连续的Item.比如这样的一段代码: var p : pChar = 'abcd ...
- Delphi容器类之---Tlist,TStringlist,THashedStringlist的效率比较
转载自:http://www.ylzx8.cn/windows/delphi/73200.html 本人在做一个测试,服务器是IOCP的,我假定最大链接数是50000个. 测试背景:如果每个链接之间的 ...
- Delphi容器类之---TList、TObjectList、TComponentList、TClassList
转载自:http://blog.csdn.net/iseekcode/article/details/4922001 从Delphi5开始VCL中增加了新的Contnrs单元,单元中定义了8个新的类, ...
- Delphi容器类之---TList、TStringList、TObjectList,以及一个例程的代码分析
转载自:http://blog.csdn.net/jqandjq/article/details/5429137 看了这里标题,大家可能以为我会谈TListBox控件,那就错了.我要谈的是Delphi ...
- Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池
前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...
- 关于 Record & TList 的一点吐槽
需求是把record 保存在TList中,并可以随时改变TList中Items的各项值. 代码很简单: MyRec = record MyStr: string; constructor Create ...
- 用Redis实现分布式锁 与 实现任务队列(转)
这一次总结和分享用Redis实现分布式锁 与 实现任务队列 这两大强大的功能.先扯点个人观点,之前我看了一篇博文说博客园的文章大部分都是分享代码,博文里强调说分享思路比分享代码更重要(貌似大概是这个意 ...
随机推荐
- CentOS 7上修改主机名
如何在CentOS 7上修改主机名 在Cent ...
- docker使用阿里云镜像加速器(属于自己的专属加速器)
https://cr.console.aliyun.com/cn-shanghai/mirrors
- 事件绑定、取消的二种形式 & call
<script> //call 函数下的一个方法,call方法第一个参数可以改变函数执行过程中的内部this的指向,call方法第二个参数开始就是原来函数的参数列表. function f ...
- SQL分组聚合查询练习(SQL Server和Oracle相似)20190514
先建表 CREATE TABLE [dbo].[orderdt_jimmy]( ,) NOT NULL, [order_nid] [int] NOT NULL, ) NOT NULL, [qty] [ ...
- Hibernate初始化环境的基本封装
public class HibernateUtils { private static SessionFactory sf; static{ sf = new Configuration().con ...
- No-9.vi __终端中的编辑器
vi —— 终端中的编辑器 01. vi 简介 1.1 学习 vi 的目的 在工作中,要对 服务器 上的文件进行 简单 的修改,可以使用 ssh 远程登录到服务器上,并且使用 vi 进行快速的编辑即可 ...
- springmvc @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
简介: handler method 参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类:(主要讲解常用类型) A.处理requet uri 部分(这里指uri templat ...
- ios之sqllite3简单使用
SQLite3是嵌入在iOS中的关系型数据库,对于存储大规模的数据很有效.SQLite3使得不必将每个对象都加到内存中. 基本操作: (1)打开或者创建数据库 sqlite3 *database; i ...
- [LOJ] 分块九题 4
https://loj.ac/problem/6280 区间修改,区间求和. 本来线段树的活. //Stay foolish,stay hungry,stay young,stay simple #i ...
- layui使用小记(持续更新)
关于Select等Form表单元素,在使用的时候部分特性会失效 如select自带的Search功能: 其实在使用Form表单元素的时候,你如果需要layui自带的一些功能(搜索,验证等),请用< ...