代码之家  ›  专栏  ›  技术社区  ›  Mike Taylor

tidtcpserver.active上的死锁=false(Delphi2007/indy10)

  •  1
  • Mike Taylor  · 技术社区  · 16 年前

    我有一个问题,一些代码是由一个开发人员编写的,现在已经离开了我们的公司,代码实现了一个tcpserver,它响应一个基于XML的协议。在我们的测试环境中,这似乎工作得非常好,但是有一两个客户在应用程序关闭方面遇到了问题。


    这就是我在onexecute活动中所拥有的

    try
      // code to handle connection including tidnotify etc....
    except
      on E:Exception do
      begin
        if (e.InheritsFrom(EIdSilentException) = False) then
          TXMLTraceNotify.XMLTrace('TCPServerExecute: ' + E.Message,ttProblem, FTraceProc);
        raise; //we must raise all exceptions for indy to handle them.
      end;
    

    结束;


    宣言。

    public
      TransactionStrings: TIdThreadSafeStringList;
    

    这就是我在tcpserver的上下文中添加它的方式。

      TransactionStrings.Add(newTrans.AsString);
    

    这就是我如何在主应用程序线程的上下文中阅读它

    slXMLTrans := TStringList.Create;
    try
      slTemp := FCustomXMLServer.TransactionStrings.Lock;
      try
        slXMLTrans.Assign(slTemp);
        slTemp.Clear;
      finally
        FCustomXMLServer.TransactionStrings.Unlock;
      end;
    
      if slXMLTrans.Count > 0 then
      begin
        for i := 0 to Pred(slXMLTrans.Count) do
          TAbstractTerminal.ProcessXMLTrans(slXMLTrans[i]);
        slXMLTrans.Clear;
      end;
    finally
      slXMLTrans.Free;
    end;
    

    我认为这是正确的使用方法,但我等待您的意见。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Remy Lebeau    16 年前

    当不正确地使用TIdTCPServer时,将Active属性设置为False时的死锁是一个经典问题,也是经常讨论的问题。服务器死锁的唯一方式是当连接线程没有正确终止时。这可能是由于在主线程忙于停用服务器时将操作同步到主线程引起的,在这种情况下,使用TIdNotify可以消除任何此类死锁情况。