Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何在XE2中中止TSQLConnection连接尝试?_Multithreading_Delphi_Client Server_Delphi Xe2 - Fatal编程技术网

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

Multithreading 如何在XE2中中止TSQLConnection连接尝试?,multithreading,delphi,client-server,delphi-xe2,Multithreading,Delphi,Client Server,Delphi Xe2,使用Delphi XE2中的TSQLConnection组件连接到DataSnap服务器 我的问题是,如果3秒后无法连接,我想中止连接尝试,但是设置驱动程序的ConnectTimeout属性似乎没有任何影响(它仍然会等待大约20秒后才会放弃) 我在一个线程中运行它,因此我可以向该线程发布一条消息(我想,线程消息队列的服务方式取决于这个阻塞调用是如何创建的)。即使我的线程消息处理程序运行,我也不确定接下来如何中断阻塞调用以设置TSQLConnection.Connected属性(在线程的Execu

使用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;
我在想这个 如果ConnectTimeout不起作用,那么您可以用另一种方法解决这个问题

首先,在连接之前,尝试通过例如Indy组件ping dest host(如果这不是本地主机;-))
或者最好试试telnet服务端口(也是由Indy提供的)-我想这是最简单的方法。我想现在可以做什么而不杀死线程呢?问题是防火墙需要允许ICMP。我知道这个示例显示了与localhost的连接,但我不认为在这种情况下使用单独的协议是解决方案。如果我误解了,请告诉我。