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;

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM