RAD Studio TCriticalSection Threrad Example Delphi

emailx45

Местный
Регистрация
5 Май 2008
Сообщения
3,571
Реакции
2,438
Credits
573
TCriticalSection Threrad Example Delphi
Ivan Revelli - 15/May/2020
[SHOWTOGROUPS=4,20]
Example on how to user a critical section in Delphi:

Delphi/Pascal

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
TThreadedMsgEvent = class( TThread )
private
FLock : TCriticalSection;
FStr : TQueue<String>;
FMemo : TMemo;
function GetEvent : String;
protected
procedure Execute; override;
public
procedure AddEvent( aMsg : String );

constructor Create( AMemo: TMemo );
destructor Destroy; override;
end;
implementation

{ TThreadedMsgEvent }

procedure TThreadedMsgEvent.AddEvent(aMsg: String);
begin
FLock.Acquire;
FStr.Enqueue( FormatDateTime('DD/MM/YY HH:NN:SS.ZZZ',Now)+ ' : '+ aMsg );
FLock.Release;
end;

constructor TThreadedMsgEvent.Create(aMemo: TMemo);
begin
inherited Create(True);

FreeOnTerminate := False;
FOnMessage := ACallBack;
FStr := TQueue<String>.Create();
FLock := TCriticalSection.Create;
FMemo := aMemo;
Resume;
end;

destructor TThreadedMsgEvent.Destroy; override;
begin
FreeAndNil( FStr );
FreeAndNil( FLock );
end;

procedure TThreadedMsgEvent.Execute;
begin
while not Terminated do
begin

try
if (FStr.Count > 0) then
begin
if Assigned( aMemo ) then
begin
TThread.synchronize( procedure
begin
FMemo.Lines.Add( GetEvent );
end; );
end;

end;
except
end;
TThread.Sleep(1);
end;

end;

function TThreadedMsgEvent.GetEvent: String;
begin
FLock.Acquire;
result := FStr.Dequeue;
FLock.Release;
end;

From post found at: Для просмотра ссылки Войди или Зарегистрируйся

In short:
How to handle Log in a Threaded manner in Delphi
Active 6 years, 10 months ago - Viewed 3k times

Delphi XE2
I have a form with a TMemo that I want to show what is going on in several services started by the application.
What I have running:
  • idHTTPServer running with idContext responding to requests
  • a Thread downloading updates from Dropbox
  • idUDPServer responding to UDP requests
  • another thread taking care of some database stuff.
  • the main application thread also needed to add log
Basically, I need to know how to create a standard, unified, thread safe way to channel the log messages to my TMemo and keep the user updated of what is going on.
....


[/SHOWTOGROUPS]