1

少し問題があります。メインアプリケーションが重い操作を実行したときに、アニメーションを表示するだけの進行状況フォームを表示したいと考えています。

これをスレッドで実行しましたが、ユーザーが操作を実行していない場合は正常に機能します。しかし、メイン アプリケーションがビジー状態になると停止します。

処理時間が長いサードパーティのコンポーネントを使用しているため、異なるコード行の間に Application.ProcessMessages を配置できません。

私のアイデアは、新しいプロセスを作成し、そのプロセスでアニメーションを実行するスレッドを作成することでした。これで、メイン アプリケーションが負荷の高い操作を実行するときにスレッド フォームの実行が停止することはなくなりました。

しかし、私が見たところ、新しいプログラムを実行する場合にのみ、新しいプロセスを作成できます。

メインアプリケーションがビジーであってもスレッドを実行し続ける方法についての解決策はありますか?

/ブライアン

4

3 に答える 3

9

ワーカー スレッドの優先度がメイン スレッドよりも低くない場合は、メソッドを使用せず、メイン GUI スレッドが既に取得した同期オブジェクトをSynchronize()呼び出したり、取得しようとしたりしないでください。SendMessage()働き続けるべきです。

Synchronize()VCL はスレッド セーフではないため、コードを実行して VCL スレッドのコンテキストで同期的に VCL コントロールを更新するようにアドバイスする人がよくいます。ただし、VCL スレッド自体がビジーの場合、これは機能しません。メイン スレッドがメッセージの処理を続行するまで、ワーカー スレッドはブロックされます。

とにかく、アプリケーションの設計は残念です。時間のかかる操作はすべてワーカー スレッドで実行し、メイン スレッドはユーザーの操作に応答するように維持する必要があります。派手なアニメーションを使用しても、VCL スレッドが他の処理でビジーでメッセージを処理していない間は再描画されないため、ユーザーにはアプリがハングしているように見えます。長いコードをワーカー スレッドに配置し、メイン スレッドのタイマー イベントでアニメーションを実行してみてください。

于 2009-11-13T13:43:06.490 に答える
7

あなたの論理は逆行しています。スレッドは「重い作業」を実行し、進行状況またはアニメーションを更新するためにメインアプリケーションにメッセージを渡す必要があります。

メインアプリケーションにすべての「重い作業」を残しておくと、他のスレッドは実行する機会が十分に得られません。つまり、何も更新する機会がありません。さらに、GUI(VCLコントロール)へのすべてのアクセスは、アプリケーションのメインスレッドで行う必要があります。VCLはスレッドセーフではありません。(ビジュアルコントロールに関しては、Windows自体もそうではありません。)

于 2009-11-13T13:43:31.183 に答える
0

「メインアプリケーションがビジー状態の場合でもスレッドを実行し続ける方法についての解決策はありますか?」メインスレッドがビジーであることを意味するので、メインスレッドを消費しているコードを別の別のスレッドに移動する必要があります。言い換えると、メインスレッドは、アクションの開始と停止を担当し、アクションを実行しないようにする必要があります。Disclaymer:実際、私はdelphyを知りませんが、概念はC ++またはC#と非常に似ていると思います。

于 2009-11-13T13:45:24.083 に答える