Sign in Join
Wiki copytemporary

Revision 2 of 4, by WikiArchive on 11-4-2026. The page as it is now.

Asynchronous Calls/ja

日本語版メニュー

メインページ - Lazarus Documentation日本語版 - 翻訳ノート - 日本語障害情報

Contents

問題について

あるイベントを処理する必要があっても、その場ですぐには処理を実行できない場合があります。例えば、オブジェクトを free しなければいけないのに、後ほど親オブジェクトなどからそのオブジェクトを参照される可能性がある場合です。

解決方法

Application.QueueAsyncCall メソッドを使用してください。

pascal
[TDataEvent](<http://lazarus-ccr.sourceforge.net/docs/lcl/forms/tdataevent.html> "doc:lcl/forms/tdataevent.html") = procedure (Data: PtrInt) of object;
    
    procedure [QueueAsyncCall](<http://lazarus-ccr.sourceforge.net/docs/lcl/forms/tapplication.queueasynccall.html> "doc:lcl/forms/tapplication.queueasynccall.html")(AMethod: TDataEvent; Data: PtrInt);

これは、任意のメソッドを「キュー」(待ち行列)に入れ、主イベントループ(訳注 : ユーザプログラムの中にあって、ウィンドウシステムから送られてくるイベントを処理するループ。Lazarus等 では隠蔽されている)の中で、他のイベントの処理が全て終わった後で実行するようにします。その際、メソッドに任意のパラメタを渡すことができます。上の例では、free する時点では親の実行が終了していますから、free しようとしているオブジェクトへの参照は消滅しており、安全に free することができるわけです。

これは ReleaseComponent の、よりジェネリックなヴァージョンであり、ReleaseComponent もこのメソッドを呼んでいることにご注意ください。

例

次のプログラムは QueueAsyncCall の使い方を示しています。 CallButton を押すと、'Click 1', 'Click 2' そして 'Async 1' が LogListBox に追加されます。注目すべきところは、Async メソッドは、CallButtonClick イベントが終了した後に実行される、という点です。

pascal
unit TestQueueAsyncCall;
    
    {$mode objfpc}{$H+}
    
    interface
    
    uses
      Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Buttons,
      StdCtrls;
    
    type
    
      { TQueueAsyncCallForm }
    
      TQueueAsyncCallForm = class(TForm)
        CallButton: TButton;
        LogListBox: TListBox;
        procedure CallButtonClick(Sender: TObject);
      private
        { private declarations }
        FCounter: PtrInt;
        procedure Async(Data: PtrInt);
      public
        { public declarations }
      end; 
    
    var
      QueueAsyncCallForm: TQueueAsyncCallForm;
    
    implementation
    
    {$R *.lfm}
    
    { TQueueAsyncCallForm }
    
    procedure TQueueAsyncCallForm.CallButtonClick(Sender: TObject);
    begin
      LogListBox.Items.Add('Click 1');
      FCounter := FCounter+1;
      Application.QueueAsyncCall(@Async,FCounter);
      LogListBox.Items.Add('Click 2');
    end;
    
    procedure TQueueAsyncCallForm.Async(Data: PtrInt);
    begin
       LogListBox.Items.Add('Async '+ IntToStr(Data));
    end;
    
    end.

関連項目


From the Free Pascal wiki, page "Asynchronous Calls/ja", as the Internet Archive kept it on 2023-03-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.