2011-08-09 12 views
8

長期間の操作では、C++ Win32アプリケーションは数秒ごとに不規則に更新されるプロセスバーを持つモーダルステータスダイアログを表示します。 Windows 7からは、Windowsがすぐに「ハングするようです...」というメッセージを表示したり、ウィンドウタイトルバーに「応答していません。Windows 7で忙しいアプリケーションが「応答しない」状態になる - WM_UPDATE

これを回避するには、プロセスダイアログでメッセージを処理する必要があることがわかりました。具体的には、Windows 7は、プログラムが稼働しているかどうかを確認するために、常にWM_UPDATEメッセージを送信しているようです。このダイアログでは、プロファイルの実行が大幅に減速していることを示すため、以前は不要なメッセージ処理をすべて無効にしていました。

しかし、私たちはこの問題を解決すると考えていましたが、Windowsは「ハングするようです」と表示したり、ウィンドウタイトルバーに「応答しない」と表示します。数秒。

質問:

  • は、Windows 7(またはWindows Vistaの場合)での動作のこの変更についてのマニュアルはありますか?我々は何も発見していない。また、メッセージングの動作には他にもいくつかの変更がありました。

  • このような "is alive"チェックをすべて無効にする方法はありますか?私たちのアプリケーションはかなり生き生きとしており、プロセスはかなり長くかかります。

EDIT:はより具体的には - 私たちは唯一の各数秒何がPeekMessage/TranslateMessage/DispatchMessageメッセージポンプを呼んでいます。

これは非常に古いレガシープログラムなので、近い将来別のワーカースレッドを使用することはできません。私たちはもちろん新しいコードのためにそれを行います。私の主なポイントは、Windows Vista/Windows 7でこの動作が間違いなく変更されたことです。私はそのドキュメントを見つけられませんでした。

+1

これは、バックグラウンドワーカースレッドのために叫んでいます。 – Deanna

+2

"**不要な**メッセージの処理をすべて無効にする" - MSDNはこの件に関して非常に明確です: "[ウィンドウプロシージャ]がメッセージを処理しない場合、**メッセージをデフォルト処理のためにシステムに返送する必要がありますウィンドウプロシージャは、DefWindowProc関数を呼び出すことでこれを行います。 – MSalters

+0

私の編集を参照してください –

答えて

18

あなたの質問への直接的な答えは、DisableProcessWindowsGhosting()に電話できるということです。

しかし、症状を抑えるのではなく、問題の根本に対処するほうがずっと良いでしょう。メッセージキューをポンピングしていないため、ウィンドウがゴーストされています。あなたのアプリケーションが仕事を忙しくしているという賞賛の理由から、あなたはそれをしていません。作業を行い、キューをポンピングし続けるために受け入れられる方法は、別のスレッドで作業を行うことです。

+0

あなたの答えをありがとう。ドキュメンテーションでは、「ウィンドウゴーストは、ユーザーが応答していないアプリケーションのメインウィンドウを最小化、移動、閉じることができるWindowsマネージャー機能です」と述べています。それは、 "ノートを掛けるようです"の無効化については何も言いません。それについてもっと知っていますか? –

+2

ゴーストを無効にすると、キャプションなどに「応答していません」というテキストは表示されません。 –

+0

UXの観点からも、別のスレッドを使用すると、現在のものを使用して、彼らの仕事の進歩。 – Ben

関連する問題