为什么单独线程中的TidTCPClient阻塞主线程?
一个单独的线程创建一个TidTCPClient和一个TTimer。 TTimer设置为3秒,如果TCPClient未连接,则它调用TCPClient.Connect。
如果没有要连接的服务器,则会每3秒尝试连接一次。为什么单独线程中的TidTCPClient阻塞主线程?
主线程(UI)什么都不做,但如果我用鼠标抓住窗口并缓慢地在屏幕上移动它,它会每3秒钟停留约2秒钟,然后跳转到鼠标光标位置并再次跟随鼠标,直到下一次连接尝试发生。
换句话说,当TCPClient尝试连接时,主线程似乎被阻塞。
为什么会发生这种情况,即使TCPClient位于单独的线程中?
您的TTimer通过接收WM_TIMER消息来工作;这些消息在VCL线程中使用VCL的主消息泵进行分派。在3秒过期后,您的TTimer.OnTimer事件在主线程中运行,因此Connect
的调用将在主VCL线程中运行。
由于您没有穿线而被阻挡!
+1“for you because not you threading! – jachguate 2011-03-22 17:02:58
只有在主线程上下文中创建了'TTimer',例如在线程的构造函数中,才会出现这种情况。有一个TTimer在一个线程中运行,它需要在线程的Execute()方法内创建,然后该线程需要自己的消息循环,以便正确调用WM_TIMER消息。不是线程安全的(因为它在内部使用'AllocateHWnd()'),所以你应该直接使用'SetTimer()',或者通过''TimeSetEvent()''通过多媒体定时器'CreateWaitableTimer() ,甚至只是一个手动睡眠循环。 – 2011-03-22 22:39:20
是的,计时器是在Thread的构造函数中创建的。感谢您的解释 – Holgerwa 2011-03-23 13:55:32
组件在线程中不存在,它们存在于内存中。代码在您调用它的线程中执行。 – 2011-03-22 17:20:56