0

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

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

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

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

4

1 回答 1

6

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

你被阻止是因为你没有线程!

于 2011-03-22T16:01:35.397 回答