我有一个TidTCPServer,它在onExcecute事件中使用数据库操作(通过使用TidNotify)。一切都很好,而不是关闭应用程序的可能性。 在关闭应用程序期间,我不知道Notify实例是否完成了他们的工作,通常我得到运行时错误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;
答案 0 :(得分:3)
有任何方法可以检查 - 是否存在 等待旧的通知帖子或不确定我可以关闭 应用强>
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;