-
Notifications
You must be signed in to change notification settings - Fork 0
/
testmainthread.pas
92 lines (78 loc) · 2.22 KB
/
testmainthread.pas
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
//-----------------------------------------------------------------------------
// Copyright 2013 Julian Schutsch
//
// This file is part of FreePascalMT
//
// ParallelSim is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published
// by the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// FreePascalMT is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with FreePascalMT. If not, see <http://www.gnu.org/licenses/>.
//-----------------------------------------------------------------------------
unit testmainthread;
{$mode objfpc}{$H+}
interface
uses classes;
type TSyncThread=class(TThread)
SyncCalled : Boolean;
procedure Execute;override;
procedure SyncMethod;
constructor Create;
destructor Destroy;override;
end;
procedure WaitMainThread;
implementation
uses uconcurrency;
// Wakeup event
var event : PRTLEvent;
procedure TSyncThread.SyncMethod;
begin
Writeln('Synchronized');
SyncCalled:=True;
end;
procedure TSyncThread.Execute;
begin
Writeln('Synchronize');
Synchronize(@SyncMethod);
end;
constructor TSyncThread.Create;
begin
inherited Create(False);
end;
destructor TSyncThread.Destroy;
begin
inherited Destroy;
end;
procedure WaitMainThread;
begin
// Fake a need for wakeup, wait for an event
RTLEventWaitFor(event);
RTLEventResetEvent(event);
CheckSynchronize();
end;
// Trivial object for WakeMainThread method
// which sets the event "event".
type WakeObj=object
procedure WakeUp(Obj:TObject);
end;
procedure WakeObj.WakeUp(Obj:TObject);
begin
RTLEventSetEvent(event);
end;
var WO:WakeObj;
// Install WakeMainThread on startup, no care taken for
// other potential wakemain candidates.
initialization
event:=RTLEventCreate;
WakeMainThread:=@WO.WakeUp;
// And remove it once the application shuts down
finalization
RTLEventDestroy(event);
end.