簡體   English   中英

我可以將Delphi TThread.Synchronize()本地移動到VCL表單以從主線程或工作線程調用嗎?

[英]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;

關於這是否正確,我有幾個問題:

  1. 我的通知可能來自工作線程,也來自主線程(例如,從按下按鈕導出)。 因此,當從主線程調用VCL表單上的“ReceiveNotification”時,是否允許如上所述調用TThread.Synchronize? XE8文檔意味着沒有,但檢查System.Classes這看起來沒問題,它工作正常。
  2. 當Label1.Caption從GetSomeStringFunction中獲取字符串時,在“ReceiveNotification”內,是否正確,即使調用來自工作線程,也絕對不需要在該函數中進行鎖定?

謝謝你的建議。

文件說:

警告:不要在主線程內調用Synchronize。 這可能導致無限循環。

我認為文檔是完全錯誤的。 XE8中的實現檢查當前線程是否是主線程。 如果是,則直接執行該方法。

沒有鎖定是必需的ReceiveNotification因為呼叫GetSomeStringFunction總是在主線程上執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM