我有一个Indy Server TIdTCPServer
,它有3个不同端口的绑定。如果我将客户端连接到这3个端口,然后停用服务器,它将陷入看似死锁的状态。无论我做什么,它都不会响应我的点击,它甚至不会报告“没有响应”Windows。如果我在停用服务器之前断开客户端连接,一切都很完美。我的意思是“停用”,如Server.Active:= False;
。
还有其他人经历过这个吗?可能是什么造成的?我在这里没有发生任何跨越线程的事情,这可能反过来导致死锁(例如GUI更新)。我尝试了Antifreeze组件TIdAntiFreeze
,但没有运气。
答案 0 :(得分:4)
TIdTCPServer
是一个多线程组件。服务器停用期间的死锁意味着其一个或多个客户端线程未正确终止。这通常意味着您的服务器事件处理程序正在做他们不应该做的事情,通常是捕获和丢弃Indy的内部异常,与忙于终止服务器的线程上下文同步,或者对Indy之外的其他东西进行死锁。如果没有看到你的实际代码,就无法确定实际上是哪种情况,但总是会出现用户错误导致这种死锁。
TIdAntiFreeze
仅影响在主线程上下文中运行的Indy组件。 TIdTCPServer没有。
答案 1 :(得分:1)
我在Form.OnClose上添加了这段代码,效果很好!
procedure TformSFTP.FormClose(Sender: TObject; var Action: TCloseAction); var iA : Integer; Context: TidContext; begin if sftpServidorFTP.Active then with sftpServidorFTP.Contexts.LockList do try for iA := Count - 1 downto 0 do begin Context := Items[iA]; if Context = nil then Continue; Context.Connection.IOHandler.WriteBufferClear; Context.Connection.IOHandler.InputBuffer.Clear; Context.Connection.IOHandler.Close; if Context.Connection.Connected then Context.Connection.Disconnect; end; finally sftpServidorFTP.Contexts.UnlockList; end;if sftpServidorFTP.Active then
sftpServidorFTP.Active := False;
端;