私のアプリケーションは、特定の複雑な数学的アルゴリズムを実行するウィンドウアプリケーションです。私は長い時間前にアプリケーションを使い始めたので、そのほとんどはまだシングルスレッドです。より正確には、メインスレッドはすべての複雑な計算ロジックを実行します。計算中に、画面上にいくつかの進捗状況を表示することは重要です。あなたのアプリケーションがまだビジー状態だと思うようにWindowsを欺く方法。
ほとんどの場合、数学的アルゴリズムは数秒しかかかりませんので、ユーザーがアクションを開始すると、砂時計(またはWindows 7では実行中の円)が表示され、数秒後に結果が表示されます。
場合によっては、アルゴリズムに数分かかることがあります。この時間の間、私は砂時計を表示し、アルゴリズムがビジーである間に、私は自分のウィンドウに進行状況を示します。しかし、ユーザーがしばらくビジー状態になってからアプリケーションをクリックすると、ウィンドウが「より白く」なり(まったく透明でないプラスチックがウィンドウの上に置かれたように)、ウィンドウはもう更新されませんWindowsは「アプリケーションが応答していません」と報告します。
私はQtを使用しています。Qt関数QWidget :: repaintを使用して、アルゴリズムが使用中に再描画を強制します。再描画はしばらくの間機能しますが、上記のように、Windowsはしばらく後にこれをブロックするようです。
あなたのアプリケーションがまだビジー状態であることをウィンドウに伝え、ウィンドウが更新され続けるようにする正しい方法は何ですか?私が明示的なメッセージループを入力すると、ユーザーはアプリケーションで望ましくない他のアクションを引き起こす可能性があります。
- PeekMessageを呼び出すだけで十分ですか?
- GetMessageを呼び出すだけで十分ですか?
- また、DispatchMessageを呼び出す必要がありますか?また、ユーザーが別のアクションを開始しないようにするにはどうすればいいですか(実際には、すべてのユーザー入力を防ぐ)
- ウィンドウを更新するたびにこれらのメッセージの1つを呼び出すか、 ?、30秒?...)
計算ロジックを別のスレッドに移動することは、現在オプションではありません。
私はVisual Studio 2010をWindows 7で、Qt 4.7と組み合わせて使用しています。
「ユーザーがアプリケーションで他の操作をトリガーする可能性があります。」そのようなコントロールを無効にします。 – ikegami