I\'m using TIDTCPServer component. As I understood event ServerTCPExecute(AContext: TIdContext)
is not synchronized. What is the best way of synchronising it?
In my application, I'm using this code:
procedure MainThreadProcedure;
begin
...
end;
.
.
.
procedure IdTCPServerExecute(AContext: TIDContext);
begin
TIdYarnOfThread(AContext.Yarn).Thread.Synchronize(MainThreadProcedure);
end;
Be sure to use a critical section or other synchronization object if you need to access main thread variables in ServerTCPExecute
The correct way is to use Indy's TIdSync
class instead of accessing Indy's internal threads directly, eg:
uses
..., IdSync;
type
TMySync = class(TIdSync)
protected
procedure DoSynchronize; override;
public
data: string;
end;
procedure TMySync.DoSynchronize;
begin
// this runs in the main thread
// use data as needed...
end;
procedure IdTCPServerExecute(AContext: TIDContext);
var
tmp: string;
sync: TMySync;
begin
tmp := ...;
sync := TMySync.Create;
try
sync.data := tmp;
sync.Synchronize;
finally
Sync.Free;
end;
end;
Just be careful with any synchronizing you do, whether it be TIdSync
or TThread.Synchronize()
. If the main thread tries to deactivate the server while the server is trying to sync with the main thread, you will deadlock both the main thread and the server.