MFC、CWnd派生でとあるクラスを作りました。このクラスはあるデータベース的な機能を提供するメソッド群とそのデータ状況をモニターする画面も提供します。
ほぼ作り終わるまで気がつかなかったのですが、データベース的メソッド群が超多忙に呼び出されると画面の反応も悪くなってしまいました。当たり前ですが。
普通は画面はあらかじめ別スレッド、もしくは別クラスで考えておくべきなのでしょうが、できれば1つのクラスで閉じさせられないかと考えております。
MFCの画面系イベントの優先度を上げるなどということは可能でしょうか?もしくは他に良いアイデアはないでしょうか?
宜しくお願い致します。
No.1ベストアンサー
- 回答日時:
「データベース的メソッド群が超多忙に呼び出される」状態のときに、なぜ「画面の反応も悪くなって」しまうのか、その理由が記述されていないので、取るべき対応策が正確には分からないのですが・・・
仮に
1. CWndのウィンドウメッセージ処理と「データベース的メソッド群」の呼び出しを含むデータベース処理を同一のスレッドで行っている。
2. 「データベース的メソッド群」の呼び出しを含むデータベース処理を長時間行っており、その間はウィンドウメッセージ処理(メッセージループの実行)が滞っている。
のであれば、2.のデータベース処理のあいだはCWndのウィンドウメッセージが処理されないため、描画が止まってしまいます。
単一スレッド構造のままでこの問題を回避するためには、次のいずれかの方法を取る必要があります。
A. 「データベース的メソッド群」の呼び出しを含むデータベース処理の実行時間を短くする。(クラスを使用するアプリケーション側を変更する。)
B. 「データベース的メソッド群」の呼び出しを含むデータベース処理を実行しているあいだ、適当なタイミングでウィンドウメッセージ処理(メッセージループの実行)を行う。(クラスを使用するアプリケーション側を変更する。)
C. 「データベース的メソッド群」の側で、適当なタイミングでウィンドウメッセージ処理(メッセージループの実行)を行う。(クラス側を変更する。)
このうちC.の方法を取る場合、クラスを使用するアプリケーション側の制御の及ばないところでウィンドウメッセージが処理される可能性があるという点に注意する必要があります。
この回答への補足
> 1. CWndのウィンドウメッセージ処理と「データ
> ベース的メソッド群」の呼び出しを含むデータ
> ベース処理を同一のスレッドで行っている。
その通りです。
> 2. 「データベース的メソッド群」の呼び出しを含
> むデータベース処理を長時間行っており、その間
> はウィンドウメッセージ処理(メッセージループ
> の実行)が滞っている。
利用者アプリに提供しているメソッド処理はどれも短い処理なのですが、連続して呼び出されるため結果的に同じことになってしまいました。
このクラスの用途を考えて利用者に迷惑のかからない
範囲で(C)の方法を試してみたいと思うのですが、
「メッセージループの実行」というのはMFCでは見えなくされているイベントループを自分で手作りすると
いうことですか(よね)?簡潔で良い参考ページがあったら教えて下さい。宜しくお願いします。
C案を考えましたがやはりB案にすることとしました。
連続して呼び出しをかけてくる利用者には定期的に以下の処理を実行してもらうこととして解決しました。
ご協力大変ありがとうございました。
voidCXNI::ProcessWM(void)
{
MSGmessage;
while(1)
{
if(::PeekMessage(&message,NULL,0,0,PM_REMOVE)==0)break;
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- C言語・C++・C# 【C++】IDirect3DSurfaceのディープコピーは可能ですか? 1 2022/07/06 02:47
- Android(アンドロイド) Googleのファミリーリンクの危険性に気付いてしまったのですが、皆さんの感想を教えてください! 2 2023/05/09 10:01
- オンラインゲーム 15年位前?のロボットをプログラムしてアリーナで戦うゲーム 1 2022/06/08 22:32
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- モニター・ディスプレイ 自室のモニターのみ目が疲れる原因が知りたい。 3 2022/12/17 19:59
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- 学校 クラスの雰囲気が真面目すぎる。 偏差値70の進学校に通う高二です。適当に理系クラスを選んでしまったせ 2 2022/05/05 08:02
- 学校 クラスの雰囲気が真面目すぎる。 偏差値70の進学校に通う高二です。適当に理系クラスを選んでしまったせ 2 2022/05/05 21:58
- 写真・ビデオ iPhone12を使っていたのですが液晶が壊れてしまいました、画面も変な線が縦に入ってしまいロック画 1 2023/01/10 02:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
tryの終了
-
アコーディオンメニューをアン...
-
データ未入力時のエラー処理が...
-
スレッド
-
ファイルの排他
-
ブラウザを閉じた後のサーバ側...
-
onBlurとonFocusの処理順序につ...
-
switch文の中に、throws new Ex...
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
インスタンス参照でアクセスで...
-
複数の変数を宣言する時、同時...
-
c++,ある関数のクラスから別の...
-
private static という変数の修飾
-
3年間同じクラスになる確率
-
配列の重複する値とその個数を...
-
コマンドプロンプト実行後に画...
-
変数名の付け方
-
ワイルドカード<?>と型パラメー...
-
JSPで<SELECT>の中にDBから持っ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tryの終了
-
数値の定数を付ける時
-
Javaでのデバッグコード削除
-
C#で別スレッドの終了を知りたい
-
[Java] while(true)の意味
-
Javaプログラムからポップアッ...
-
Tomcatのスレッドを破棄する方法
-
ラジオボタンの選択判定
-
JavaScriptからJAVAクラスを呼...
-
素数判定を再帰処理で
-
PHPでDB処理中にプログレスバー...
-
Javaアプリケーション実行の返...
-
WPF C#でF10のイベント取得方法...
-
doGetとdoPostの違い
-
switch文の中に、throws new Ex...
-
Tomcat高負荷時の設定について
-
ラベルの表示までが異常に遅い...
-
ExcelVBA で文字列の特定の文字...
-
JDBCでテーブルUPDATE後の再検...
-
SwingUtilities.invokeLater(ne...
おすすめ情報