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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…