2

2 つのスレッドを持つサービス アプリケーションをコーディングしています。最初のスレッドで、ラベル付きのフォームを表示します。2 番目のスレッド、ADO を照会します。

最初のスレッドは常に砂時計カーソルとラベル キャプションなしでフリーズします。

助けてください。

4

2 に答える 2

4

メインスレッドではないスレッド内からフォームを表示しようとすると、このような奇妙なことに遭遇します。最も注目すべきは、フォームとラベルが非メイン スレッドで作成された場合、メッセージを処理するためのメッセージ ループがないことです。メイン スレッドで作成されたフォームを非メイン スレッドから表示しようとしている場合は、Windows がメッセージとスレッドを処理する方法が原因でデッド ロックが発生している可能性があります。

ウィンドウ ハンドルが作成されると、それが作成されたスレッドに関連付けられます。これは、Windows が、そのハンドルに送信されたすべてのメッセージがそのスレッドで処理されることを保証することを意味します。

ウィンドウ メッセージ、メッセージ キュー、およびハンドルがすべてマルチスレッド環境でどのように相互作用し、機能するかをよくお読みになることを強くお勧めします。正しく実行しないと、非常に奇妙で予測不可能な動作が発生する可能性があります。

于 2010-02-04T05:52:13.027 に答える
0

私はあなたの状態を人種、デッドロック、またはそのような他の種類のエラーのいずれかと呼びます。Allenが言うように、TThread.Synchronize(myMethod)を使用してVCLフォアグラウンドに接触するmyMethodを呼び出さずに、バックグラウンドスレッドがVCLコントロールに直接アクセスする場合、これだけで問題が発生します。

コードのサンプルなど、詳細情報を投稿してください。

于 2010-02-10T17:02:16.330 に答える