我正在使用TIDTCPServer组件。据我了解事件ServerTCPExecute(AContext: TIdContext)
不同步。同步它的最佳方法是什么?我需要将数据发送到主线程并让它们返回格式化答案。
我正在使用Indy 10.5.8.0。
方法1
是这样的吗我应该处理关键部分将数据从非同步函数传递给应用程序?
var data:string;
.
.
.
procedure MainThreadProcedure;
begin
...
end;
.
.
.
procedure IdTCPServerExecute(AContext: TIDContext);
var tmp: string;
begin
.
.
.
EnterCriticalSection(cs);
data:= tmp;
TIdYarnOfThread(AContext.Yarn).Thread.Synchronize(MainThreadProcedure);
LeaveCriticalSection(cs);
end;
答案 0 :(得分:12)
正确方式是使用Indy的TIdSync
类而不是直接访问Indy的内部线程,例如:
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;
请注意任何同步,无论是TIdSync
还是TThread.Synchronize()
。如果主线程在服务器尝试与主线程同步时尝试停用服务器,则会使主线程和服务器死锁。
答案 1 :(得分:0)
在我的应用程序中,我正在使用此代码:
procedure MainThreadProcedure;
begin
...
end;
.
.
.
procedure IdTCPServerExecute(AContext: TIDContext);
begin
TIdYarnOfThread(AContext.Yarn).Thread.Synchronize(MainThreadProcedure);
end;
如果需要访问ServerTCPExecute