vic*_*ico 5 delphi multithreading indy
我正在使用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;
Run Code Online (Sandbox Code Playgroud)
Rem*_*eau 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;
Run Code Online (Sandbox Code Playgroud)
只要小心你做的任何同步,无论是TIdSync或TThread.Synchronize().如果主线程在服务器尝试与主线程同步时尝试停用服务器,则会使主线程和服务器死锁.
| 归档时间: |
|
| 查看次数: |
4312 次 |
| 最近记录: |