博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TList实现的任务队列
阅读量:5773 次
发布时间:2019-06-18

本文共 1629 字,大约阅读时间需要 5 分钟。

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;

转载地址:http://pnaux.baihongyu.com/

你可能感兴趣的文章
php加速工具xcache的安装与使用(基于LNMP环境)
查看>>
android超链接
查看>>
redhat tomcat
查看>>
统计数据库大小
查看>>
IO流的学习--文件夹下文件的复制
查看>>
第十六章:脚本化HTTP
查看>>
EXCEL表中如何让数值变成万元或亿元
查看>>
nginx在响应request header时候带下划线的需要开启的选项
查看>>
Linux下DHCP服务器配置
查看>>
AndroidStudio中导入SlidingMenu报错解决方案
查看>>
我的IDEA配置
查看>>
myeclipse显示行号
查看>>
编写高性能的java程序
查看>>
Spring 的配置详解
查看>>
linux已经不存在惊群现象
查看>>
上位机和底层逻辑的解耦
查看>>
关于微信二次分享 配置标题 描述 图片??
查看>>
springcloud使用zookeeper作为config的配置中心
查看>>
校园火灾Focue-2---》洗手间的一套-》电梯
查看>>
css控制文字换行
查看>>