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
| ///////////////////////////////////////////////////////////////////////////
// //
// Copyright (c) 2015 by Charta Software B.V. //
// All rights reserved //
// //
// Version: 1.7.0.83525 //
// Web site: https://pascal.chartasoftware.com/ //
// //
// This code and information are provided "as is" without warranty of //
// any kind. Dissemination of this information or reproduction of //
// this material is strictly forbidden unless prior written permission //
// is obtained from Charta Software B.V.. //
// //
///////////////////////////////////////////////////////////////////////////
unit Event.Queue;
interface
uses
Event,
Integer._32.Positive,
Object_.List,
Thread.WaitableObject,
Windows.Api.Type_;
type
TEventQueue = class(TWaitableObject)
protected
function GetThreadIdentifier(): TPositiveInteger32; virtual; abstract;
public
procedure Queue(Event: TEvent); virtual; abstract;
function Dequeue(): TEvent; virtual; abstract;
function DequeueIfAvailable(): TEvent; virtual; abstract;
function GetWaitHandle(): THandle; override;
function WaitForAny(Objects: TObjectList<TWaitableObject>; TimeOut_Milliseconds: TPositiveInteger32): TWaitableObject; virtual; abstract;
property ThreadIdentifier: TPositiveInteger32 read GetThreadIdentifier;
end;
implementation
uses
Exception.NotImplemented;
{ TEventQueue }
function TEventQueue.GetWaitHandle(): THandle;
begin
// TODO: It should be possible to add a TEventQueue to a TWaitableObjectGroup and wait for an event that way. That is why the TEventQueue extends
// TWaitableObject. However, currently we require TEventQueue.WaitForAny() to be called to wait for one event queue and possibly multiple
// other objects.
raise ENotSupported.Create(ClassType, 'GetWaitHandle');
end;
end.
|