单独的线程会创建TidTCPClient和TTimer。 TTimer设置为3s,如果TCPClient未连接,则调用TCPClient.Connect 如果没有要连接的服务器,则会导致每隔3秒尝试连接一次。
主线程(UI)什么都不做,但是如果我用鼠标抓住窗口并在屏幕上缓慢移动它,它会每3秒钟停留约2秒钟,然后跳转到鼠标光标位置再次跟随鼠标,直到下一次连接尝试发生。
换句话说,当TCPClient尝试连接时,主线程似乎被阻止了。
为什么会发生这种情况,即使TCPClient在它的单独线程中?
答案 0 :(得分:6)
您的TTimer通过接收WM_TIMER消息起作用;在VCL线程中使用VCL的主消息泵调度这些消息。 3秒过期后,您的TTimer.OnTimer事件在主线程中运行,因此对Connect
的调用将在主VCL线程中运行。
你被封锁了,因为你没有穿线!