2012-04-26 10 views
2

メッセージをスローするスレッドをベースにしたメッセージキューがあります。スレッド内のいくつかのアクティビティはVCLコマンドになる可能性があるため、Synchronizeで実行されます。 Synchronizeが呼び出されると、スレッドがハングします。サンプルコード:Synchronizeがスレッドをハングするように見える

do_msgには何も処理されていません。誰かが私が間違っていることを知っていますか?

+4

メインスレッドでは何が起こっていますか?同期にはMessageLoopが必要です。メインスレッドがこのスレッドを待っている場合は、それが表示されます。 –

+4

ハンクの+1 - 死んだDelphiアプリケーションの#1理由の特定 - TThread.Synchronize、TThread.WaitFor()ハンク氏のように、あなたのGUIスレッドで何をしていても、それをやめ、イベントハンドラを終了してメッセージを処理し直します。この段階で、 'Application.ProcessMessages'というフレーズがあなたの脳を通過している場合は、それを消去してください。 –

+0

あなたが正しいかどうかはわかります(下のcomemntを参照)。そして、Application.ProcessMessagesに対して警告してくれてありがとう:-)。私は夕方にこれをテストします。 – Arnold

答えて

4

TThread.Synchronize()ブロックは、メインスレッドが要求を処理するまでブロックします。メインスレッドでは、要求を処理するためにアクティブなメッセージループが必要です(手動でApplication.ProcessMessages()またはCheckSynchronize()を定期的に呼び出さない限り)。スレッドの主な作業が常にTThread.Synchronize()によって呼び出されている場合は、スレッドをまったく使用する必要はありません。代わりにメインスレッドでタイマーまたはカスタムウィンドウメッセージを使用し、不要な複雑さをすべて取り除くことができます。

+0

私はこのように簡単になるだろうと恐れています。私の主なスレッドは続けられます。これをチェックして戻ってきます。 – Arnold

+0

あなた(そしてヘンクとマーティン)が正しかった。私はある種のタスクがどれくらい持続したかを判断するためのタイマーとしてメインスレッドを使用していました。私は2つの異なるプロセスがあるので、ここでスレッドを使用します。あるプロセスでは何かが起こり、別のプロセス(非同期的に)が結果を処理します。 http://stackoverflow.com/questions/9033860/reduce-cpu-time-spent-in-vclでは、2つのスレッドを使用して、CPUを必要とするタスクとそうでないタスクを分離することが推奨されていました。この場合のスレッドはより複雑ですが、メッセージを処理するタイミングを考える必要はありません。あなたがそれを単純に保つ限り、スレッドは時には物事を単純化します。 – Arnold

関連する問題