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イベントがメインスレッドで実行されるため、への呼び出しConnectはメインVCLスレッドで実行されます。

スレッド化していないため、ブロックされます。

于 2011-03-22T16:01:35.397 に答える