知道德里Indy 10插座的人吗?组件TIdTCPServer。我有一个服务,使用TIdTCPServer实例化多个线程(多线程)来处理来自多个客户端的请求(tidTCPClient)。
这一切都正常,没问题,但在服务(服务器)中,我有一个屏幕,用于更新日志和连接用户列表并记录他们正在做的事情,并在备忘录主屏幕中查看此日志。
事实证明,多线程必须使用Syncronize来更新主线程序中的备忘录。到目前为止还好吗?
备忘录将在事件idTCPServerExecute组件中更新,只有我所拥有的事件参数是(AContext:TIdContext)我抓住了运行给她的线程的实例可以调用syncronize吗?
想做类似的事情:
AContext.thread.Syncronize(LogMemo); //将在主帖上写下备忘录。
但我搜索并没有找到线程对象。有谁知道这个对象在哪里?
或者如何在不与其他线程竞争的情况下更新此事件中的屏幕?
procedure TfrmMainServer.TCPServerExecute(AContext: TIdContext);
var
Cmd : String;
begin
if AContext.Connection.IOHandler.Connected then
begin
If not AContext.Connection.IOHandler.InputBufferIsEmpty Then Begin
Cmd := AContext.Connection.IOHandler.ReadLn;
// This is not acceptable in this way :
memoFile.Lines.Add ('TESTING');
txtInfoLabel.Caption := 'Arquivo enviado';
End;
end;
end;
答案 0 :(得分:2)
您可以从Indy的TIdSync
或TIdNotify
课程中派生一个班级,并覆盖TIdSync.DoSynchronize()
或TIdNotify.DoNotify()
方法来执行您需要的操作。
或者,在最近的Delphi版本中,您可以使用静态TThread.Synchronize()
或TThread.Queue()
方法的匿名过程版本。
这两种方法的例子在Embarcadero的论坛,Indy的论坛,StackOverflow等之前已多次发布。搜索。
答案 1 :(得分:0)
TIdTCPServer.OnConnect(AContext:TIdContext)也有类似的问题 在我的事件处理程序中,我需要在主线程中操作TVirtualStringTree。 我用谷歌搜索了这篇文章:
http://www.delphigroups.info/2/4/211251.html
运行Delphi Rio 10.3 Indy 10的代码对我来说是
uses IdSync;
procedure TMyClass.OnConnectFromClientChangedProc;
begin
// Code to be executed in main thread
end;
procedure TMyClass.OnMyClientConnect(AContext: TIdContext);
begin
TIdSync.SynchronizeMethod(OnConnectFromClientChangedProc);
end;
可以类似的方式管理OnExecute事件。