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;
