zoukankan      html  css  js  c++  java
  • Delphi Firemonkey在主线程 异步调用函数(延迟调用)

    先看下面的FMX.Layouts.pas中一段代码

    procedure TCustomScrollBox.MouseDown(Button: TMouseButton; Shift: TShiftState;
      X, Y: Single);
    begin
      FMouseEvents := True;
      inherited;
      if (Button = TMouseButton.mbLeft) then
      begin
        MousePosToAni(X, Y);
        AniMouseDown(ssTouch in Shift, X, Y);
      end;
    end;
    

    在执行Inherited;这行时可能会调用控件的OnDblClick事件,如果此时在OnDblClick中将Form或控件释放了,后面调用MousePosToAni可能就会造成内存访问异常

    因此最好能够在UI线程(主线程)中执行MouseDown完全后,再调用Form或控件的释放,如下面

    procedure TForm1.OnListBox1Item1DblClick(Sender:TObject);
    begin
      ....//处理一些事情 
      AsyncCallInUIThread(
        procedure
        begin
          Self.DisposeOf; //延迟释放,防止内存访问异常
        end);
    end;
    

      

    下面是AsyncCallInUIThread的实现:

    procedure AsyncCallInUIThread(Proc: TProc);
    begin
      TThread.CreateAnonymousThread(
        procedure
        begin
          Sleep(0);
          TThread.Synchronize(nil, 
            procedure 
            begin 
              Proc; 
            end); 
        end).Start; 
    end;
    

      

  • 相关阅读:
    ES6 学习记录
    Windows 服务开发 以及 重启IIS应用池
    IIS部署.net core 3.1踩坑总结
    VS 2019背景全透明以及插件、特效
    深拷贝和浅拷贝的区别
    Vue全家桶以及常用知识点
    C#设计模式
    博客园装扮教程
    Exp5 单元测试
    Exp4 代码评审
  • 原文地址:https://www.cnblogs.com/hezihang/p/4600898.html
Copyright © 2011-2022 走看看