forked from DelphiWorlds/KastriFree
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDW.Classes.Helpers.pas
142 lines (124 loc) · 3.8 KB
/
DW.Classes.Helpers.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
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
130
131
132
133
134
135
136
137
138
139
140
141
142
unit DW.Classes.Helpers;
{*******************************************************}
{ }
{ Kastri Free }
{ }
{ DelphiWorlds Cross-Platform Library }
{ }
{*******************************************************}
{$I DW.GlobalDefines.inc}
interface
uses
// RTL
System.Classes;
type
/// <summary>
/// Thread-based convenience methods.
/// </summary>
/// <remarks>
/// "TDo" as in "Do" something - shortest form of a word associated with running a task that I could think of
/// </remarks>
TDo = record
public
/// <summary>
/// Queues a method for execution after an optional delay
/// </summary>
class procedure Queue(const AProc: TThreadProcedure; const ADelay: Integer = 0); static;
/// <summary>
/// Synchronizes a method for execution after an optional delay
/// </summary>
class procedure Sync(const AProc: TThreadProcedure; const ADelay: Integer = 0); static;
/// <summary>
/// Syncs a method in the main thread, if necessary
/// </summary>
class procedure SyncMain(const ARunProc: TThreadProcedure); static;
/// <summary>
/// Runs a method in a thread
/// </summary>
class procedure Run(const ARunProc: TThreadProcedure); static;
/// <summary>
/// Runs a method in a thread and queues/syncs a callback if supplied
/// </summary>
class procedure RunQueue(const ARunProc: TThreadProcedure; const ACallbackProc: TThreadProcedure = nil); static;
/// <summary>
/// Runs a method in a thread and queues/syncs a callback if supplied
/// </summary>
class procedure RunSync(const ARunProc: TThreadProcedure; const ACallbackProc: TThreadProcedure = nil); static;
end;
TStreamHelper = record
public
class function AsString(const AStream: TStream): string; static;
end;
implementation
uses
// RTL
System.SysUtils;
{ TDo }
class procedure TDo.Queue(const AProc: TThreadProcedure; const ADelay: Integer = 0);
begin
TThread.CreateAnonymousThread(
procedure
begin
Sleep(ADelay);
TThread.Queue(nil, AProc);
end
).Start;
end;
class procedure TDo.Sync(const AProc: TThreadProcedure; const ADelay: Integer = 0);
begin
TThread.CreateAnonymousThread(
procedure
begin
Sleep(ADelay);
TThread.Synchronize(nil, AProc);
end
).Start;
end;
class procedure TDo.SyncMain(const ARunProc: TThreadProcedure);
begin
if TThread.CurrentThread.ThreadID <> MainThreadID then
TThread.Synchronize(nil, ARunProc)
else
ARunProc;
end;
class procedure TDo.Run(const ARunProc: TThreadProcedure);
begin
RunQueue(ARunProc);
end;
class procedure TDo.RunQueue(const ARunProc: TThreadProcedure; const ACallbackProc: TThreadProcedure = nil);
begin
TThread.CreateAnonymousThread(
procedure
begin
ARunProc;
if Assigned(ACallbackProc) then
TThread.Queue(nil, ACallbackProc);
end
).Start;
end;
class procedure TDo.RunSync(const ARunProc: TThreadProcedure; const ACallbackProc: TThreadProcedure = nil);
begin
TThread.CreateAnonymousThread(
procedure
begin
ARunProc;
if Assigned(ACallbackProc) then
TThread.Synchronize(nil, ACallbackProc);
end
).Start;
end;
{ TStreamHelper }
class function TStreamHelper.AsString(const AStream: TStream): string;
var
LStream: TStringStream;
begin
AStream.Position := 0;
LStream := TStringStream.Create;
try
LStream.CopyFrom(AStream, AStream.Size);
Result := LStream.DataString;
finally
LStream.Free;
end;
end;
end.