プロが教えるわが家の防犯対策術!

MFC、CWnd派生でとあるクラスを作りました。このクラスはあるデータベース的な機能を提供するメソッド群とそのデータ状況をモニターする画面も提供します。

ほぼ作り終わるまで気がつかなかったのですが、データベース的メソッド群が超多忙に呼び出されると画面の反応も悪くなってしまいました。当たり前ですが。

普通は画面はあらかじめ別スレッド、もしくは別クラスで考えておくべきなのでしょうが、できれば1つのクラスで閉じさせられないかと考えております。

MFCの画面系イベントの優先度を上げるなどということは可能でしょうか?もしくは他に良いアイデアはないでしょうか?

宜しくお願い致します。

A 回答 (1件)

「データベース的メソッド群が超多忙に呼び出される」状態のときに、なぜ「画面の反応も悪くなって」しまうのか、その理由が記述されていないので、取るべき対応策が正確には分からないのですが・・・



仮に

1. CWndのウィンドウメッセージ処理と「データベース的メソッド群」の呼び出しを含むデータベース処理を同一のスレッドで行っている。
2. 「データベース的メソッド群」の呼び出しを含むデータベース処理を長時間行っており、その間はウィンドウメッセージ処理(メッセージループの実行)が滞っている。

のであれば、2.のデータベース処理のあいだはCWndのウィンドウメッセージが処理されないため、描画が止まってしまいます。

単一スレッド構造のままでこの問題を回避するためには、次のいずれかの方法を取る必要があります。

A. 「データベース的メソッド群」の呼び出しを含むデータベース処理の実行時間を短くする。(クラスを使用するアプリケーション側を変更する。)
B. 「データベース的メソッド群」の呼び出しを含むデータベース処理を実行しているあいだ、適当なタイミングでウィンドウメッセージ処理(メッセージループの実行)を行う。(クラスを使用するアプリケーション側を変更する。)
C. 「データベース的メソッド群」の側で、適当なタイミングでウィンドウメッセージ処理(メッセージループの実行)を行う。(クラス側を変更する。)

このうちC.の方法を取る場合、クラスを使用するアプリケーション側の制御の及ばないところでウィンドウメッセージが処理される可能性があるという点に注意する必要があります。

この回答への補足

> 1. CWndのウィンドウメッセージ処理と「データ
> ベース的メソッド群」の呼び出しを含むデータ
> ベース処理を同一のスレッドで行っている。

その通りです。

> 2. 「データベース的メソッド群」の呼び出しを含
> むデータベース処理を長時間行っており、その間
> はウィンドウメッセージ処理(メッセージループ
> の実行)が滞っている。

利用者アプリに提供しているメソッド処理はどれも短い処理なのですが、連続して呼び出されるため結果的に同じことになってしまいました。

このクラスの用途を考えて利用者に迷惑のかからない
範囲で(C)の方法を試してみたいと思うのですが、
「メッセージループの実行」というのはMFCでは見えなくされているイベントループを自分で手作りすると
いうことですか(よね)?簡潔で良い参考ページがあったら教えて下さい。宜しくお願いします。

補足日時:2005/09/19 15:29
    • good
    • 1
この回答へのお礼

C案を考えましたがやはりB案にすることとしました。

連続して呼び出しをかけてくる利用者には定期的に以下の処理を実行してもらうこととして解決しました。

ご協力大変ありがとうございました。



voidCXNI::ProcessWM(void)
{
MSGmessage;
while(1)
{
if(::PeekMessage(&message,NULL,0,0,PM_REMOVE)==0)break;
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}

お礼日時:2005/09/20 11:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!