Sign in Join
Wiki copytemporary

Asynchronous Calls/ja: what changed

Revision 3 to 4. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## 問題について
22
33あるイベントを処理する必要があっても、その場ですぐには処理を実行できない場合があります。例えば、オブジェクトを free しなければいけないのに、後ほど親オブジェクトなどからそのオブジェクトを参照される可能性がある場合です。
44
55## 解決方法
66
77Application.[[doc:lcl/forms/tapplication.queueasynccall.html|QueueAsyncCall]] メソッドを使用してください。
88
9-[[doc:lcl/forms/tdataevent.html|TDataEvent]]` = procedure (Data: PtrInt) of object;`\
9+``` pascal
10+TDataEvent = procedure (Data: PtrInt) of object;
1011
11-`procedure `[[doc:lcl/forms/tapplication.queueasynccall.html|QueueAsyncCall]]`(AMethod: TDataEvent; Data: PtrInt);`\
12+procedure QueueAsyncCall(AMethod: TDataEvent; Data: PtrInt);
13+```
1214
1315これは、任意のメソッドを「キュー」(待ち行列)に入れ、主イベントループ(訳注 : ユーザプログラムの中にあって、ウィンドウシステムから送られてくるイベントを処理するループ。Lazarus等 では隠蔽されている)の中で、他のイベントの処理が全て終わった後で実行するようにします。その際、メソッドに任意のパラメタを渡すことができます。上の例では、free する時点では親の実行が終了していますから、free しようとしているオブジェクトへの参照は消滅しており、安全に free することができるわけです。
1416
1517これは [[doc:lcl/forms/tapplication.releasecomponent.html|ReleaseComponent]] の、よりジェネリックなヴァージョンであり、ReleaseComponent もこのメソッドを呼んでいることにご注意ください。
1618
1719## 例
1820
1921次のプログラムは [[doc:lcl/forms/tapplication.queueasynccall.html|QueueAsyncCall]] の使い方を示しています。 CallButton を押すと、'Click 1', 'Click 2' そして 'Async 1' が LogListBox に追加されます。注目すべきところは、Async メソッドは、CallButtonClick イベントが終了した後に実行される、という点です。
2022
2123``` pascal
2224unit TestQueueAsyncCall;
2325
2426{$mode objfpc}{$H+}
2527
2628interface
2729
2830uses
2931 Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Buttons,
3032 StdCtrls;
3133
3234type
3335
3436 { TQueueAsyncCallForm }
3537
3638 TQueueAsyncCallForm = class(TForm)
3739 CallButton: TButton;
3840 LogListBox: TListBox;
3941 procedure CallButtonClick(Sender: TObject);
4042 private
4143 { private declarations }
4244 FCounter: PtrInt;
4345 procedure Async(Data: PtrInt);
4446 public
4547 { public declarations }
4648 end;
4749
4850var
4951 QueueAsyncCallForm: TQueueAsyncCallForm;
5052
5153implementation
5254
5355{$R *.lfm}
5456
5557{ TQueueAsyncCallForm }
5658
5759procedure TQueueAsyncCallForm.CallButtonClick(Sender: TObject);
5860begin
5961 LogListBox.Items.Add('Click 1');
6062 FCounter := FCounter+1;
6163 Application.QueueAsyncCall(@Async,FCounter);
6264 LogListBox.Items.Add('Click 2');
6365end;
6466
6567procedure TQueueAsyncCallForm.Async(Data: PtrInt);
6668begin
6769 LogListBox.Items.Add('Async '+ IntToStr(Data));
6870end;
6971
7072end.
7173
7274```
7375
7476## 関連項目
7577
7678- [New 0.9.26 features. Part 1. SendMessage and PostMessage](http://lazarus-dev.blogspot.com/2008/01/new-0926-features-part-1-sendmessage.html)
7779- [[Main Loop Hooks]]
7880- [[Multithreaded Application Tutorial/ja|マルチスレッドアプリケーションチュートリアル]]
7981
8082---
8183*From the Free Pascal wiki, page "Asynchronous Calls/ja", as it stood on 2020-02-09 after a change by Trev, out of the wiki's dump of 2024-05-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](/wiki-contact).*

Back to history