如何在TIdTCPServer OnExecute中同步线程

时间:2014-12-20 15:12:13

标签: delphi indy10

知道德里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;

2 个答案:

答案 0 :(得分:2)

您可以从Indy的TIdSyncTIdNotify课程中派生一个班级,并覆盖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事件。