TThread.Queue和TThread.Synchronize的区别

效果上:二者的作用都是让业务代码在主线程中执行,差别: Synchronize是阻塞,Queue是非阻塞

代码上 两个方法最终都是调用的 class procedure TThread.Synchronize(ASyncRec: PSynchronizeRecord; QueueEvent: Boolean = False)类方法,
差别
Synchronize则是使用了Thread对象中的FSynchronize对象变量,然后QueueEvent为False来调用TThread.Synchronize类方法, 
内部在执行FSynchronize时,创建了事件对象,通过WaitForSingleObject来阻塞执行。 
Queue调用是自己创建了一个PSynchronizeRecord, 然后QueueEvent为True来调用TThread.Synchronize类方法,内部则把PSynchronizeRecord放入SyncList列表中,然后退回,并不直接执行PSynchronizeRecord, 那问题来了,在那里执行呢?Delphi在TApplication.Idle方法中执行(最终调用了CheckSynchronize)
procedure TForm1.OnReceived(Sender: TObject; AConnection: ICrossConnection; ABuf: Pointer; ALen: Integer);
begin
TThread.Queue(nil,
procedure
begin
var ms: tstream := TMemoryStream.Create;
ms.Size := ALen;
ms.Write(ABuf^, ALen);
ms.Position := 0;
var ms2: tstream := TMemoryStream.Create;
tzip.UnZipStream(ms, ms2); //unzip
ms.Free;
ms2.Position := 0;
var pack: tmsgpack := TMsgPack.Create;
pack.DecodeFromStream(ms2);
case pack.Force('cmd').AsInteger of
cmd_query:
begin
form1.ClientDataSet1.Data := pack.Force('dataset1').AsVariant;
form1.ClientDataSet2.Data := pack.Force('dataset2').AsVariant;
end;
end;
pack.Free;
end);
end;

  

最新文章

  1. iOS 系统架构
  2. ORACLE 数据库 MOD 函数用法
  3. Codeforces Round #375 (Div. 2) - A
  4. Android数据存储之sharedpreferences与Content Provider
  5. 晕,hibernate 的 merge和cascade="all-delete-orphan"要慎重合在一起使用
  6. Vector使用
  7. Keil C调试经验
  8. 配置数据库连接池,Tomcat6.0 连接池的配置
  9. 工具类 util.Date 日期类
  10. Qt错误:类中使用Q_OBJECT宏导致undefined reference to vtable for "xxx::xxx"错误的原因和解决方法
  11. 基于Keepalvied的Mysql主主漂移(切换)
  12. TensorFlow框架(3)之MNIST机器学习入门
  13. 1.8 range
  14. Python--(爬虫与数据库的连接)
  15. java 浅克隆 深克隆
  16. IdentityServer4【QuickStart】之使用ClientCredentials流程保护API
  17. 野(wild)指针与悬空(dangling)指针
  18. 【Web Service】
  19. python3 使用 zabbix_client模块
  20. [Codeforces166B]Polygons 凸包

热门文章

  1. sublime的package control的中文镜像
  2. Flume 初探
  3. 190919 centos系统中python2卸载重装
  4. git rebase 版本。。变基
  5. python爬有道翻译
  6. SQL进阶系列之2自连接
  7. 利用Python openpyxl操作Excel
  8. 手写Java的字符串简单匹配方法IndexOf()
  9. 【Python】编程小白的第一本python(基础中的基础)
  10. 关于Bigdecimal的问题