如何在XE2中终止TSQLConnection连接尝试?

5
在Delphi XE2中使用TSQLConnection组件连接到DataSnap服务器。我的问题是,如果我们在3秒内无法连接,则希望中止连接尝试,但是设置驱动程序的ConnectTimeout属性似乎没有任何影响(它仍然等待大约20秒才放弃)。我在线程内运行此操作,因此我可以向线程发送消息(我认为是否服务于线程消息队列取决于创建此阻塞调用的方式)。即使我的线程消息处理程序运行,我也不确定如何打断阻塞调用以设置TSQLConnection.Connected属性(该属性在线程的Execute方法中设置)。我不想调用TerminateThread,因为这似乎过度,而且会留下(如果我理解正确)分配给线程堆栈的内存。欢迎提供有关如何中断此连接进程或访问底层Indy组件并明确设置连接超时的任何想法。谢谢!
fConnection := TSQLConnection.Create(nil);
with fConnection do
begin
  DriverName := 'DataSnap';
  Params.Values['CommunicationProtocol'] := 'tcp/ip';
  Params.Values['DatasnapContext'] := 'datasnap/';
  Params.Values['HostName'] := '127.0.0.1';
  Params.Values['Port'] := '211';
  Params.Values['ConnectTimeout'] := '3000';
  KeepConnection := true;
  LoginPrompt := true;
end;

// Where it blocks for up to 20 seconds (if host unavailable)
fConnection.Connected := True;
1个回答

1

我在考虑这个问题,如果连接超时无效,那么你可以用另一种方式解决

首先,在连接之前尝试使用例如Indy组件ping目标主机(如果不是本地主机;-)或更好的方法是尝试通过Indy telnet服务端口 - 我认为这是你现在可以做的最简单的事情,而不会使线程失效。


这个问题在于防火墙需要允许ICMP。我知道示例显示了与本地主机的连接,但我认为在这种情况下使用单独的协议并不能解决问题。如果我理解有误,请告诉我。 - Duncan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接