博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TThread.Queue和TThread.Synchronize的区别
阅读量:4966 次
发布时间:2019-06-12

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

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;

  

转载于:https://www.cnblogs.com/hnxxcxg/p/11312934.html

你可能感兴趣的文章
设计类图
查看>>
ios中将事件添加到系统日历
查看>>
类对象
查看>>
ios 上架流程
查看>>
ajax连接池和XMLHttpRequest
查看>>
[Voice communications] 声音的滤波
查看>>
BZOJ.3139.[HNOI2013]比赛(搜索 Hash)
查看>>
json在线解析
查看>>
Git的优势
查看>>
存储设备形成的层次结构
查看>>
查看oracle数据库服务器的名字
查看>>
第1章 单例模式(Single Pattern)
查看>>
JavaScript网站设计实践(四)编写about.html页面,利用JavaScript和DOM,选择性的显示和隐藏DIV元素...
查看>>
silverlight 获取文本框焦点
查看>>
Ubuntu 16.04 几个国内更新源
查看>>
源码阅读 - java.util.concurrent (三)ConcurrentHashMap
查看>>
C语言——第三次作业
查看>>
C++ primer笔记 -基本语言
查看>>
js 获取当前标签 jquery1.11.4
查看>>
解决2.3.x某些系统中listview超出item高度部分灰色背景问题
查看>>