File: uasynccall.pas

package info (click to toggle)
lazarus 2.0.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 214,460 kB
  • sloc: pascal: 1,862,622; xml: 265,709; cpp: 56,595; sh: 3,008; java: 609; makefile: 535; perl: 297; sql: 222; ansic: 137
file content (129 lines) | stat: -rw-r--r-- 2,663 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
unit uasynccall;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls;

  
type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    RadioGroup1: TRadioGroup;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    procedure SimpleMethod(Data: PtrInt);
    procedure ComplexMethod(Data: PtrInt);
  public

  end; 

var
  Form1: TForm1; 

implementation

{$R *.lfm}

type
  TMyData = record
    S: string;
    data: longint;
  end;
  PMyData = ^TMyData;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  MyData: PMyData;
begin
  {
   A direct call, calls the method directly and is executed before the
   Button1Click is finished.

   As result you will see in memo such lines:
     1. Sending message
     2. Got message
     3. Exiting Button.Click()
  }
  Memo1.Lines.Add('--------------------------------');
  Memo1.Lines.Add('Sending message by <Direct call>');
  case RadioGroup1.ItemIndex of
    0 : SimpleMethod(1);
    1 :
      begin
        new(MyData);
        MyData^.data:=1;
        MyData^.S:= 'direct call';
        ComplexMethod(PtrInt(MyData));
      end;
  end;
  Memo1.Lines.Add('Exiting Button.Click()');
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  MyData: PMyData;
begin
  {
   QueueAsyncCall queues the method call, so you will get it only
   after other events have been processed.
   You can use QueueAsyncCall to postpone some
   operations, for example until the application is idle.

   As result you will see in memo such lines:
     1. Sending message
     2. Exiting Button.Click()
     3. Got message
  }
  Memo1.Lines.Add('--------------------------------');
  Memo1.Lines.Add('Sending message by QueueAsyncCall');
  case RadioGroup1.ItemIndex of
    0 : Application.QueueAsyncCall(@SimpleMethod, 2);
    1 :
      begin
        new(MyData);
        MyData^.data:=1;
        MyData^.S:= 'QueueAsyncCall call';
        Application.QueueAsyncCall(@ComplexMethod, PtrInt(MyData));
      end;
  end;
  Memo1.Lines.Add('Exiting Button.Click()');
end;

procedure TForm1.SimpleMethod(Data: PtrInt);
var
  S: String;
begin
  case Data of
    1: S := '<DirectCall>';
    2: S := '<QueueAsyncCall>';
  else
    S := '<unknown>'
  end;
  Memo1.Lines.Add('SimpleMethod got called using: ' + S);
end;

procedure TForm1.ComplexMethod(Data: PtrInt);
var
  MyData: TMyData;
begin
  MyData:=PMyData(Data)^;
  Memo1.Lines.Add(
    format('Complex got called using %s and data %d',
      [MyData.S, MyData.Data]));
  Dispose(PMyData(Data));
end;

end.