加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 在同一[main]线程上调用队列过程

发布时间:2020-12-15 09:27:25 所属栏目:大数据 来源:网络整理
导读:我正在处理一些特定的TForm事件[CMControlListChanging], 并且需要修改那个(插入的)控件,但是当我尝试这样做时,事情会变坏,因为显然它并不意味着在VCL操作过程中这样做. 因此,我需要通过将代码排除在[CMControlListChanging]处理程序之外来推迟控制修改,以便
我正在处理一些特定的TForm事件[CMControlListChanging],
并且需要修改那个(插入的)控件,但是当我尝试这样做时,事情会变坏,因为显然它并不意味着在VCL操作过程中这样做.

因此,我需要通过将代码排除在[CMControlListChanging]处理程序之外来推迟控制修改,以便稍后调用.

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

System.Classes单元包含

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

这可以做到这一点,但它检查,是否
????CurrentThread.ThreadID = MainThreadID
?如果是,那么调用方法我尝试立即排队.

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

解决方法

不确定这是否是您正在寻找的,但如果您使用的是最近的Delphi版本,这些推迟的方法可能会派上用场.它们在应用可选的非阻塞延迟后在主线程中执行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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读