Sign in Join
Wiki copytemporary

Asynchronous Calls/fr: what changed

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

OldNewLine
11# Position du problème
22
33Quand vous manipulez certains événements, vous avez besoin de faire quelque chose, mais vous ne pouvez le faire correctement. Exemple : vous devez libérer un objet, mais il est ou sera référencé quelque part dans le parent (ou son parent etc.) plus tard.
44
55# Solution
66
77Appeler Application.[[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
1315Cela placera en file d'attente la méthode donnée avec le paramètre donné pour execution dans la boucle principale des événements, quand tous les autres événements auront été traités. Dans l'exemple du dessus, la référence à l'objet que vous vouliez libérer est partie, depuis le parent d'alors a fini son exécution et l'objet que vous vouliez libérer peut l'être de manière sûre.
1416
1517Remarquez qu'il y a une version plus générique de [[doc:lcl/forms/tapplication.releasecomponent.html|ReleaseComponent]], et ReleaseComponent appele cette méthode.
1618
1719# Exemple
1820
1921Le programme suivant montre l'utilisation de [[doc:lcl/forms/tapplication.queueasynccall.html|QueueAsyncCall]]. Si vous pressez sur le CallButton, 'Click 1', 'Click 2' et 'Async 1' sont ajoutés dans le LogListBox. Remarquez que l'appel Async est seulement exécuté après que l'événement CallButtonClick s'est terminé.
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# Voir aussi
7476
7577- [Fonctionnalité ajoutée dans la 0.9.26. Partie 1. SendMessage et PostMessage](http://lazarus-dev.blogspot.com/2008/01/new-0926-features-part-1-sendmessage.html)
7678- [[Main Loop Hooks/fr|Crochet (hooks) dans la boucle principale]]
7779- [[Multithreaded Application Tutorial/fr|Tutoriel sur les application Multithreadées]]
7880
7981---
8082*From the Free Pascal wiki, page "Asynchronous Calls/fr", 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