Difference between revisions of "Asynchronous Calls"
m (Text replace - "delphi>" to "syntaxhighlight>") |
|||
Line 21: | Line 21: | ||
The following program shows the use of [[doc:lcl/forms/tapplication.queueasynccall.html |QueueAsyncCall]]. If you press on the CallButton, 'Click 1', 'Click 2' and 'Async 1' is added to the LogListBox. Note that Async call is only executed after the CallButtonClick event has finished. | The following program shows the use of [[doc:lcl/forms/tapplication.queueasynccall.html |QueueAsyncCall]]. If you press on the CallButton, 'Click 1', 'Click 2' and 'Async 1' is added to the LogListBox. Note that Async call is only executed after the CallButtonClick event has finished. | ||
− | < | + | <syntaxhighlight>unit TestQueueAsyncCall; |
{$mode objfpc}{$H+} | {$mode objfpc}{$H+} | ||
Line 70: | Line 70: | ||
{$I testqueueasynccall.lrs} | {$I testqueueasynccall.lrs} | ||
− | end.</ | + | end.</syntaxhighlight> |
==See also== | ==See also== |
Revision as of 14:49, 24 March 2012
│
English (en) │
français (fr) │
日本語 (ja) │
русский (ru) │
Problem statement
When handling some event, you need to do something, but you can't do it right away. Example: you need to free an object, but it is or will be referenced somewhere in the parent (or its parent etc.) later on.
Solution
Call Application.QueueAsyncCall:
TDataEvent = procedure (Data: PtrInt) of object; procedure QueueAsyncCall(AMethod: TDataEvent; Data: PtrInt);
This will "queue" the given method with the given parameter for execution in the main event loop, when all other events have been processed. In the example above, the reference to the object you wanted to free has gone, since the then-parent has finished execution, and the object you wanted to free can be freed safely.
Note that this is a more generic version of ReleaseComponent, and ReleaseComponent calls this method.
Example
The following program shows the use of QueueAsyncCall. If you press on the CallButton, 'Click 1', 'Click 2' and 'Async 1' is added to the LogListBox. Note that Async call is only executed after the CallButtonClick event has finished.
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
{ 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;
initialization
{$I testqueueasynccall.lrs}
end.