队列过程调用相同的[main]线程

Ale*_*kXL 5 delphi

我正在处理一些特定的TForm事件[ CMControlListChanging ],并且需要修改那个(插入的)控件,但是当我尝试这样做时,事情变得糟糕,因为显然它并不意味着在VCL操作这样做.

所以,我需要推迟对照修改,通过排队从[代码走CMControlListChanging ]处理程序,在被称为稍后时间.

当然,我可以做PostMessage的东西,但我想要更通用的方法.

System.Classes单元包含

class procedure Synchronize(ASyncRec:PSynchronizeRecord; QueueEvent:Boolean = False); 超载;

可以做的伎俩,但它检查,无论CurrentThread.ThreadID = MainThreadID,如果是,然后调用方法我尝试立即排队.

延迟调用的任何方法,至少在主线程上?

Uwe*_*abe 4

不确定这是否是您正在寻找的,但如果您使用的是最新的 Delphi 版本,这些Postpone方法可能会派上用场。在应用可选的非阻塞延迟后,它们在主线程中执行AProc 。

uses
  System.Threading,
  System.Classes;

procedure Postpone(AProc: TThreadProcedure; ADelayMS: Cardinal = 0); overload;
begin
  TTask.Run(
    procedure
    begin
      if ADelayMS > 0 then begin
        TThread.Sleep(ADelayMS);
      end;
      TThread.Queue(nil, AProc);
    end);
end;

procedure Postpone(AProc: TThreadMethod; ADelayMS: Cardinal = 0); overload;
begin
  TTask.Run(
    procedure
    begin
      if ADelayMS > 0 then begin
        TThread.Sleep(ADelayMS);
      end;
      TThread.Queue(nil, AProc);
    end);
end;
Run Code Online (Sandbox Code Playgroud)