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;

时间: 2024-11-13 08:03:36

TList实现的任务队列的相关文章

在Node.js中使用RabbitMQ系列二 任务队列

在上一篇文章在Node.js中使用RabbitMQ系列一 Hello world我有使用一个任务队列,不过当时的场景是将消息发送给一个消费者,本篇文章我将讨论有多个消费者的场景. 其实,任务队列最核心解决的问题是避免立即处理那些耗时的任务,也就是避免请求-响应的这种同步模式.取而代之的是我们通过调度算法,让这些耗时的任务之后再执行,也就是采用异步的模式.我们需要将一条消息封装成一个任务,并且将它添加到任务队列里面.后台会运行多个工作进程(worker process),通过调度算法,将队列里的任

c# 异步任务队列(可选是否使用单线程执行任务,以及自动取消任务)

使用demo,(.net framework 4.0 自行添加async wait 扩展库) class Program { static void Main(string[] args) { Console.WriteLine("主线程"+Thread.CurrentThread.ManagedThreadId); var asyncTaskQueue = new AsyncTaskQueue { AutoCancelPreviousTask = true, // 自动取消之前的任务

Java/Android中的优先级任务队列的实践

版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com 刚刚把公司的活干完,去群里水,有几个小伙伴问我怎么实现队列,于是乎我来写一篇吧.本篇文章适用于Java和Android开发者,会从实现一个最简单的队列过渡到实现一个带有优先级的队列,保准你可以掌握基本的队列原理. 队列的基本理解 用生活中的一个情景来举个栗子,前段时间很火爆的电视剧<人民的名义>中有一个丁义珍式的窗口大家应该都知道了,我们不说<人民的名义>也不说丁义珍,我们来说说这个办

Celery 分布式任务队列快速入门

本节内容 Celery介绍和基本使用 启用多个workers Celery 定时任务 与django结合 通过django配置celery periodic task 一.Celery介绍和基本使用 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个实例场景中可用的例子: 你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着结果返回,而是给你返

Delphi中Tlist实例

http://blog.163.com/[email protected]/blog/static/74728469201132721428194/ Delphi中Tlist实例 2011-04-27 14:14:28|  分类: Delphi学习 |  标签:list  frmred  tform  frmblue  frmgreen  |举报|字号 订阅 下载LOFTER我的照片书  | unit Unit1; interface uses  Windows, Messages, SysUt

可伸缩多线程任务队列(转载)

出自:http://blog.csdn.net/tianmohust/article/details/9335243 在我们的工作中,我们经常需要异步执行一些任务,下面介绍的这个可伸缩多线程队列,可满足我们的需求. 出自:http://www.codeproject.com/Articles/4148/Multithreaded-Job-Queue,主要有以下几个功能: 1.任务队列是多线程,许多任务可以异步进行,任务队列使用线程池来执行任务. 2.任务队列支持优先级,优先级高的任务优先执行(即

Delphi容器类之---TList、TObjectList、TComponentList、TClassList的使用

转载自:http://blog.csdn.net/iseekcode/article/details/4922001 从Delphi5开始VCL中增加了新的Contnrs单元,单元中定义了8个新的类,全部都是基于标准的TList类. TList TList类实际上就是一个可以存储指针的容器类,提供了一系列的方法和属性来增加.删除.重排.定位.存取和排序容器中的类,它是基于数组的机制来实现的容器,比较类似于C++中的Vector和Java中的ArrayList. TList经常用来保存一组对象列表

Delphi小谈之TList

转载自:http://blog.csdn.net/jqandjq/article/details/5429137 在我刚接触TList的时候,TList搞得我迷雾重重,都是Capacity属性惹的祸.我查了Delphi的帮助,它说Capacity是Tlist的最大容量,又在什么地方说MaxInt div 4是TList的最大容量.最后我搞明白了,Capacity是临时的,MaxInt div 4 才是真正的最大容量.只要你的内存受得了就行,算起来一共是4G. 在TList内部有一个FList指针

Redis研究(十五)—任务队列

在网站开发中,当页面需要进行如发送邮件.复杂数据运算等耗时较长的操作时会阻塞页面的渲染.为了避免用户等待太久,应该使用独立的线程来完成这类操作. 不过一些编程语言或框架不易实现多线程,这时很容易就会想到通过其他进程来实现.设想有一个进程能够完成发邮件的功能,那么在页面中只需要想办法通知这个 进程向指定的地址发送邮件就可以了. 通知的过程可以借助任务队列来实现.任务队列顾名思义,就是“传递任务的队列”.与任务队列进行交互的实体有两类,一类是生产者(producer),一类是消费者(consumer