[英]Can I move Delphi TThread.Synchronize() locally to a VCL form to be called from both a main or worker thread?
我正在使用CreateAnonymousThread作為工作任務,當我開始使用它時,我根據文檔示例在整個聲明中使用了Synchronize,例如:
procedure Txxx.RunWorker;
begin
FExecutionThread := TThread.CreateAnonymousThread(procedure ()
begin
TThread.Synchronize (TThread.CurrentThread,
procedure ()
begin
// Here before worker stuff
NotifyBeforeWorkerStuff;
end);
// Do worker stuff
TThread.Synchronize (TThread.CurrentThread,
procedure ()
begin
// Here after worker stuff
NotifyAfterWorkerStuff;
end);
end);
FExecutionThread.Start;
end;
end;
如您所見,在此線程中,我向我的應用程序的各個部分啟動事件通知,包括VCL表單(NotifyBeforeWorkerStuff等)。 后來,我看到我可以將Synchronize()更多地本地移動到每個VCL表單,接近實際需要它更新(非安全)VCL控件的點:
procedure TSomeVCLForm.ReceiveNotification;
begin
TThread.Synchronize (TThread.CurrentThread,
procedure ()
begin
Label1.Caption := GetSomeStringFunction;
end);
end;
只要我接收來自主線程或工作線程的通知,工作線程就會變得更簡單:
procedure Txxx.RunWorker;
begin
FExecutionThread := TThread.CreateAnonymousThread(procedure ()
begin
NotifyBeforeWorkerStuff;
// Do worker stuff
NotifyAfterWorkerStuff;
end);
FExecutionThread.Start;
end;
關於這是否正確,我有幾個問題:
謝謝你的建議。
文件說:
警告:不要在主線程內調用Synchronize。 這可能導致無限循環。
我認為文檔是完全錯誤的。 XE8中的實現檢查當前線程是否是主線程。 如果是,則直接執行該方法。
沒有鎖定是必需的ReceiveNotification
因為呼叫GetSomeStringFunction
總是在主線程上執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.