线程A处理完Data后,通过OnAfterExecute事件,将Data插入到线程B的数据队列中以待处理。
问题1, OnAfterExecute是否需要用Synchronize调用?
问题2, 如果要在OnAfterExecute中访问界面控件,就得一定得用Synchronize调用,但OnAfterExecute的实现不在线程中,如何调用Synchronize?

解决方案 »

  1.   

    OnAfterExecute是哪個類的事件啊?TThread類沒有這個事件啊
      

  2.   

    自定义的,如
    procedure AThread.Execute;
    begin
      ...
      if Assigned(FOnAfterExecute) then begin
        FOnAfterExecute(FData);
      end;
    end;因为AThread只负责处理FData,处理完后该怎么做,交给OnAfterExecute事件去完成。
    OnAfterExecute需要做两件事,一是将FData添加到BThread的待处理数据队列中,二是在界面上显示当前的处理情况。
    大至情况这是这样,线程之间如何同步?
      

  3.   

    procedure AThread.DoAfterExecute;
    begin
      if Assigned(FOnAfterExecute) then
        FOnAfterExecute(FData);
    end;procedure AThread.Execute;
    begin
      ...
      
      Synchronize(DoAfterExecute);
    end; 
      

  4.   

    按樓主的描述,OnAfterExecute是自定義的一個事件,那么同步是必須的,使用AThread.Synchronize()方法。
    當然有一個技巧,建議樓主不要使用事件,而是使用自定義消息,當線程執行完Execute代碼時,使用SendMessage發送消息給主線程,主線程接收到消息後,完成原來是在OnAfterExecute事件內完成的工作,這樣的話不必做同步。
      

  5.   

    To budded :  如果这样的话,OnAfterExecute事件里的所有代码,都将由主线程来执行。OnAfterExecute事件里涉及到界面的代码需要用Synchronize, 而其他代码也Synchronize, 这样做会不会降低效率,或者导致其他的问题呢?
      

  6.   

    LZ是問我還是budded?如果使用消息機制,就不要再使用Synchronize了,因為這些將會在主線程即UI線程中執行,當然用不著同步,不會有任何問題。好像以前的VCL源碼中,對於同步本質上也是使用了SendMessage,後來才改的,所以不必擔心。
    但是如果你使用事件的話,實際上還是在AThread類的線程中執行,調用Synchronize是必須的。
      

  7.   

    感谢boblaw的解答,我先试下看.