- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:画面系イベントの優先度を上げたい)
画面系イベントの優先度を上げたい
このQ&Aのポイント
- MFC、CWnd派生でデータベース的な機能を提供する画面の反応が悪くなる問題
- 1つのクラスで閉じさせるための方法や他のアイデアを探している
- MFCの画面系イベントの優先度を上げて問題を解決したい
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
「データベース的メソッド群が超多忙に呼び出される」状態のときに、なぜ「画面の反応も悪くなって」しまうのか、その理由が記述されていないので、取るべき対応策が正確には分からないのですが・・・ 仮に 1. CWndのウィンドウメッセージ処理と「データベース的メソッド群」の呼び出しを含むデータベース処理を同一のスレッドで行っている。 2. 「データベース的メソッド群」の呼び出しを含むデータベース処理を長時間行っており、その間はウィンドウメッセージ処理(メッセージループの実行)が滞っている。 のであれば、2.のデータベース処理のあいだはCWndのウィンドウメッセージが処理されないため、描画が止まってしまいます。 単一スレッド構造のままでこの問題を回避するためには、次のいずれかの方法を取る必要があります。 A. 「データベース的メソッド群」の呼び出しを含むデータベース処理の実行時間を短くする。(クラスを使用するアプリケーション側を変更する。) B. 「データベース的メソッド群」の呼び出しを含むデータベース処理を実行しているあいだ、適当なタイミングでウィンドウメッセージ処理(メッセージループの実行)を行う。(クラスを使用するアプリケーション側を変更する。) C. 「データベース的メソッド群」の側で、適当なタイミングでウィンドウメッセージ処理(メッセージループの実行)を行う。(クラス側を変更する。) このうちC.の方法を取る場合、クラスを使用するアプリケーション側の制御の及ばないところでウィンドウメッセージが処理される可能性があるという点に注意する必要があります。
お礼
C案を考えましたがやはりB案にすることとしました。 連続して呼び出しをかけてくる利用者には定期的に以下の処理を実行してもらうこととして解決しました。 ご協力大変ありがとうございました。 void CXNI::ProcessWM (void) { MSG message; while(1) { if(::PeekMessage(&message,NULL,0,0,PM_REMOVE)==0) break; ::TranslateMessage(&message); ::DispatchMessage(&message); } }
補足
> 1. CWndのウィンドウメッセージ処理と「データ > ベース的メソッド群」の呼び出しを含むデータ > ベース処理を同一のスレッドで行っている。 その通りです。 > 2. 「データベース的メソッド群」の呼び出しを含 > むデータベース処理を長時間行っており、その間 > はウィンドウメッセージ処理(メッセージループ > の実行)が滞っている。 利用者アプリに提供しているメソッド処理はどれも短い処理なのですが、連続して呼び出されるため結果的に同じことになってしまいました。 このクラスの用途を考えて利用者に迷惑のかからない 範囲で(C)の方法を試してみたいと思うのですが、 「メッセージループの実行」というのはMFCでは見えなくされているイベントループを自分で手作りすると いうことですか(よね)?簡潔で良い参考ページがあったら教えて下さい。宜しくお願いします。