为什么单独线程中的TidTCPClient会阻塞主线程?

时间:2011-03-22 15:41:02

标签: delphi delphi-2009 indy10

单独的线程会创建TidTCPClient和TTimer。 TTimer设置为3s,如果TCPClient未连接,则调用TCPClient.Connect 如果没有要连接的服务器,则会导致每隔3秒尝试连接一次。

主线程(UI)什么都不做,但是如果我用鼠标抓住窗口并在屏幕上缓慢移动它,它会每3秒钟停留约2秒钟,然后跳转到鼠标光标位置再次跟随鼠标,直到下一次连接尝试发生。

换句话说,当TCPClient尝试连接时,主线程似乎被阻止了。

为什么会发生这种情况,即使TCPClient在它的单独线程中?

1 个答案:

答案 0 :(得分:6)

您的TTimer通过接收WM_TIMER消息起作用;在VCL线程中使用VCL的主消息泵调度这些消息。 3秒过期后,您的TTimer.OnTimer事件在主线程中运行,因此对Connect的调用将在主VCL线程中运行。

你被封锁了,因为你没有穿线!