gpt4 book ai didi

connection - Indy、TidNotify 和关闭 TidTCPServer

转载 作者:行者123 更新时间:2023-12-04 05:11:17 26 4
gpt4 key购买 nike

我有一个 TidTCPServer,它在 onExcecute 事件中使用数据库操作(通过使用 TidNotify)。一切都很好,而不是可能关闭应用程序。
在关闭应用程序期间,我不知道所有通知实例是否都完成了工作,通常我得到运行时错误 216(我想我在“通知”工作结束之前关闭了数据库)。
有什么方法可以检查 - 是否有等待旧的通知帖子或不确定我可以关闭应用程序。
另一个问题是如何保护 TidTCPServer 在关闭服务器过程中不接受新连接。
我使用下面的代码,但我仍然得到错误。

type
TShutdownThread = class(TThread)
protected
procedure Execute; override;
end;


procedure TShutdownThread.Execute;
begin
IdTCPServer.Active := false;
end;


//closing...
if IdTCPServer.Active then
begin
with TShutdownThread.Create(false) do
try
WaitFor; // internally processes sync requests...
finally
Free;
end;
end;

最佳答案

有什么方法可以检查 - 有没有
等待旧的通知帖子或不确定我可以关闭
应用。

TIdNotify是异步的,它将请求发布到主线程消息队列以供稍后执行。在 TShutdownThread.WaitFor() 之后,待处理的请求可能仍在队列中。已退出。您可以调用 RTL 的 CheckSynchronize()处理任何剩余请求的功能,例如:

if IdTCPServer.Active then
begin
with TShutdownThread.Create(false) do
try
WaitFor;
finally
Free;
end;
CheckSynchronize;
end;

如何保护 TidTCPServer 在关闭服务器过程中不接受新连接。

TIdTCPServer正在停用,它会为您关闭其监听端口。但是,在服务器关闭端口之前可以接受新客户端的机会窗口非常小。服务器将关闭这些连接作为其关闭的一部分,但如果您不希望 OnExecute为这些连接调用事件,然后您可以在停用服务器之前在代码中的某处设置一个标志,然后在 OnConnect 中检查该标志事件,如果设置了则立即断开客户端,例如:
var
ShuttingDown: boolean = False;

procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
begin
if ShuttingDown then
begin
AContext.Connection.Disconnect;
Exit;
end;
...
end;

...

if IdTCPServer.Active then
begin
ShuttingDown := True;
try
with TShutdownThread.Create(false) do
try
WaitFor;
finally
Free;
end;
CheckSynchronize;
finally
ShuttingDown := False;
end;
end;

关于connection - Indy、TidNotify 和关闭 TidTCPServer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14909996/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com