Difference between revisions of "Asynchronous Calls/fr"

From Lazarus wiki
Jump to navigationJump to search
(Created page with "{{Asynchronous Calls}} = Position du problème = Quand vous manipulez certains événements, vous avez besoin de faire quelques chose, mais vous ne pouvez le faire correctem...")
 
m (Fixed syntax highlighting)
 
(2 intermediate revisions by 2 users not shown)
Line 3: Line 3:
 
= Position du problème =
 
= Position du problème =
  
Quand vous manipulez certains événements, vous avez besoin de faire quelques chose, mais vous ne pouvez le faire correctement. Exemple : vous devez liberer un objet, mais il est ou sera référencé quelque part dans le parent (ou son parent etc.) plus tard.
+
Quand 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.
  
== Solution ==
+
= Solution =
  
 
Appeler Application.[[doc:lcl/forms/tapplication.queueasynccall.html |QueueAsyncCall]]:
 
Appeler Application.[[doc:lcl/forms/tapplication.queueasynccall.html |QueueAsyncCall]]:
Line 17: Line 17:
 
Remarquez qu'il y a une version plus générique de [[doc:lcl/forms/tapplication.releasecomponent.html |ReleaseComponent]], et ReleaseComponent appele cette méthode.
 
Remarquez qu'il y a une version plus générique de [[doc:lcl/forms/tapplication.releasecomponent.html |ReleaseComponent]], et ReleaseComponent appele cette méthode.
  
== Exemple ==
+
= Exemple =
  
 
Le 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é.
 
Le 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é.
  
<syntaxhighlight>unit TestQueueAsyncCall;
+
<syntaxhighlight lang="pascal">
 +
unit TestQueueAsyncCall;
  
 
{$mode objfpc}{$H+}
 
{$mode objfpc}{$H+}

Latest revision as of 08:59, 9 February 2020

English (en) français (fr) 日本語 (ja) русский (ru)

Position du problème

Quand 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.

Solution

Appeler Application.QueueAsyncCall:

TDataEvent = procedure (Data: PtrInt) of object;

procedure QueueAsyncCall(AMethod: TDataEvent; Data: PtrInt);

Cela 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.

Remarquez qu'il y a une version plus générique de ReleaseComponent, et ReleaseComponent appele cette méthode.

Exemple

Le programme suivant montre l'utilisation de 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é.

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.

Voir aussi