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实现分布式锁 与 实现任务队列 这两大强大的功能.先扯点个人观点,之前我看了一篇博文说博客园的文章大部分都是分享代码,博文里强调说分享思路比分享代码更重要(貌似大概是这个意 ...
随机推荐
- C# 递归读取XML菜单数据
在博客园注册了有4年了,很遗憾至今仍未发表过博客,趁周末有空发表第一篇博客.小生不才,在此献丑了! 最近在研究一些关于C#的一些技术,纵观之前的开发项目的经验,做系统时显示系统菜单的功能总是喜欢把数据 ...
- Android(java)学习笔记167:横竖屏切换时Activity的生命周期
1.横竖屏切换的生命周期 默认情况下横竖屏切换,先销毁再创建 2.有的时候,默认情况下的横竖屏切换(先销毁再创建),对应用户体验是不好的,比如是手机游戏横竖屏切换对游戏体验非常不好,下面两种方 ...
- 图解在Ubuntu16.04中安装MySQL
1.安装mysql-server sudo apt-get install mysql-server 输入y,回车.等待下载,安装 出现下图,需要设定Mysql的密码. 输入密码,回车,弹出确认对话框 ...
- vue点击时动态改变样式 ------- 最简单的方法
vue点击时动态改变样式 template中 <li :class="{ active:index==isActive }" @click="changeValue ...
- window.onload和DOMContentLoaded的区别
一.何时触发这两个事件? 1.当 onload 事件触发时,页面上所有的DOM,样式表,脚本,图片,flash都已经加载完成了. 2.当 DOMContentLoaded 事件触发时,仅当DOM加载完 ...
- JavaEE-07 过滤器和监听器
学习要点 过滤器 监听器 过滤器Filter 过滤器的概念 过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应. 在请求到达Servlet/JSP之前,过滤器截获请求. 在响 ...
- js实现返回上一页功能
大家在做 "返回上一页" 这个功能的时候 都是用history.go(-1);来实现的 但这段代码只是简单的使用浏览器的后退功能 从浏览器缓存中取出页面来显示 但我们绝大部分情况都 ...
- 2011 luogu P1311 选择客栈
题目描述 丽江河边有 nn 家很有特色的客栈,客栈按照其位置顺序从 1 到 n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖 ...
- CodeForces - 930A Peculiar apple-tree(dfs搜索)
题目: 给出一个树,这棵树上每个结点每一秒都会结出一颗果实,果实每经过一秒就会落向下一个结点,如果一个结点在同一时刻上的果实两两抵消,问最后在根节点处一共有多少个果实. 思路: dfs直接搜索统计这棵 ...
- 前端面试绝对会考的JS问题!【已经开源】
写在前面 [前端指南]前端面试库已经开源,正在完善之中 [x] css问题 [x] html问题 [x] javascript问题 github地址 https://github.com/nanhup ...