画面系イベントの優先度を上げたい

このQ&Aのポイント
  • MFC、CWnd派生でデータベース的な機能を提供する画面の反応が悪くなる問題
  • 1つのクラスで閉じさせるための方法や他のアイデアを探している
  • MFCの画面系イベントの優先度を上げて問題を解決したい
回答を見る
  • ベストアンサー

画面系イベントの優先度を上げたい

MFC、CWnd派生でとあるクラスを作りました。このクラスはあるデータベース的な機能を提供するメソッド群とそのデータ状況をモニターする画面も提供します。 ほぼ作り終わるまで気がつかなかったのですが、データベース的メソッド群が超多忙に呼び出されると画面の反応も悪くなってしまいました。当たり前ですが。 普通は画面はあらかじめ別スレッド、もしくは別クラスで考えておくべきなのでしょうが、できれば1つのクラスで閉じさせられないかと考えております。 MFCの画面系イベントの優先度を上げるなどということは可能でしょうか?もしくは他に良いアイデアはないでしょうか? 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

「データベース的メソッド群が超多忙に呼び出される」状態のときに、なぜ「画面の反応も悪くなって」しまうのか、その理由が記述されていないので、取るべき対応策が正確には分からないのですが・・・ 仮に 1. CWndのウィンドウメッセージ処理と「データベース的メソッド群」の呼び出しを含むデータベース処理を同一のスレッドで行っている。 2. 「データベース的メソッド群」の呼び出しを含むデータベース処理を長時間行っており、その間はウィンドウメッセージ処理(メッセージループの実行)が滞っている。 のであれば、2.のデータベース処理のあいだはCWndのウィンドウメッセージが処理されないため、描画が止まってしまいます。 単一スレッド構造のままでこの問題を回避するためには、次のいずれかの方法を取る必要があります。 A. 「データベース的メソッド群」の呼び出しを含むデータベース処理の実行時間を短くする。(クラスを使用するアプリケーション側を変更する。) B. 「データベース的メソッド群」の呼び出しを含むデータベース処理を実行しているあいだ、適当なタイミングでウィンドウメッセージ処理(メッセージループの実行)を行う。(クラスを使用するアプリケーション側を変更する。) C. 「データベース的メソッド群」の側で、適当なタイミングでウィンドウメッセージ処理(メッセージループの実行)を行う。(クラス側を変更する。) このうちC.の方法を取る場合、クラスを使用するアプリケーション側の制御の及ばないところでウィンドウメッセージが処理される可能性があるという点に注意する必要があります。

1qazxsw2
質問者

お礼

C案を考えましたがやはりB案にすることとしました。 連続して呼び出しをかけてくる利用者には定期的に以下の処理を実行してもらうこととして解決しました。 ご協力大変ありがとうございました。 void CXNI::ProcessWM (void) { MSG message; while(1) { if(::PeekMessage(&message,NULL,0,0,PM_REMOVE)==0) break; ::TranslateMessage(&message); ::DispatchMessage(&message); } }

1qazxsw2
質問者

補足

> 1. CWndのウィンドウメッセージ処理と「データ > ベース的メソッド群」の呼び出しを含むデータ > ベース処理を同一のスレッドで行っている。 その通りです。 > 2. 「データベース的メソッド群」の呼び出しを含 > むデータベース処理を長時間行っており、その間 > はウィンドウメッセージ処理(メッセージループ > の実行)が滞っている。 利用者アプリに提供しているメソッド処理はどれも短い処理なのですが、連続して呼び出されるため結果的に同じことになってしまいました。 このクラスの用途を考えて利用者に迷惑のかからない 範囲で(C)の方法を試してみたいと思うのですが、 「メッセージループの実行」というのはMFCでは見えなくされているイベントループを自分で手作りすると いうことですか(よね)?簡潔で良い参考ページがあったら教えて下さい。宜しくお願いします。

関連するQ&A

  • イベントとスレッド

    Java初心者です。 イベントとスレッドに関する質問です。 Swingを使ったアプリケーションを作成しているのですが、 以下のような現象が起きています。 1. ボタンが配置されているダイアログ(A)で、そのボタンを押下する。 2. ボタンを押下したときに実行されるメソッドで、スレッドを作成する。 3. その作成されたスレッドで、JOptionPane#showOptionDialogを実行して、ダイアログ(B)を表示する。 4.(B)が表示されている状態で、別のウィンドウで隠し、再度表示させると、(B)に配置されているボタンが押せなくなる。 4.で(B)のボタンを押せるようにしたいのですが、 うまくいきません。 スレッドとかイベントが関係していると思うのですが、 何しろ初心者なもので、よく理解していません。 実際のプログラムをお見せすることが出来ないので分かりずらいかもしれませんが、何かお気づきのことがあれば 教えて頂けないでしょうか? よろしくお願い致します。

    • ベストアンサー
    • Java
  • CListView クラスのタイトル部分をクリックしたときのイベントは?

    VC6.0のMFCでプログラムしています。 あるウィンドウにCListView クラスの派生クラスを作成して貼り付けています。 このタイトル部分をマウスでクリック(ドラッグして幅を変更)した時のイベントはどのようにすれば拾えるのでしょうか? WM_LBUTTONDOWN イベントですと、タイトル下の一覧をクリックしたときには拾えるのですが、タイトル部分をクリックしても拾えません。 すみませんがよろしくお願いします。

  • C++ビルダーでイベント付きスレッドクラスを作成したい

    C++系(主にボーランドビルダー)でVBの様なイベント付きクラスを作成したいのです。 単なるスレッドクラスの定義は: //---------------------------------------------- // クラス // スレッドクラスより派生 //---------------------------------------------- class CUserClass : public TThread { private: AnsiString aa; HANDLE hr; // ハンドル protected: HWND FormHandle; // 親フォームハンドル void __fastcall Execute();// スレッドメイン処理 public: __fastcall CUserClass(bool,AnsiString ,HWND ); // コンストラクタ __fastcall ~CUserClass(); // デストラクタ }; でいいのですが・・・。 何かクラス側で変化があったとき、クラスを使う親側モジュールにイベントを発生させたいのですが。 クラス側から親側に SendMessage( 親側ハンドル, 送りたいメッセージ, 0, 0 ); でメッセージを送る方法があるのですが、これだと親側がクラスでないといけないし、送りたいメッセージが固定となるし・・・。 よい方法を教えてください。

  • イベントドリブンとオブジェクト指向

    現役S.E.です。イベントドリブンとオブジェクト指向のことを説明する必要に迫られています。しかし、私自身知識が混乱してしまい、説明に自信がないので教えてください。 オブジェクト指向は、構造化プログラミングに変わって登場してきた考え方ですよね。クラスを設計してイベントやプロパティ、メソッドを実装してインスタンスを派生していくプログラミング方法であると認識しています。 それから、イベントドリブンはマウスでのクリックとかキーの押下などのイベントに応じて、様々なアクションを起こすという考え方だと認識しています。 それで、ちょっと考えるとイベントドリブンを実現するためには、アクションやメソッドがないと動かせないと思うので、オブジェクト指向でないと実現できないと思うのですが、構造化プログラミングなのにイベントドリブンで動かすみたいなケースってあるのでしょうか? イベントドリブンという考え方を、オブジェクト指向と組み合わせて開設してしまっていいのかどうかがよく分からなくなってしまいました。 どんな風に解説したらいいか、アドバイス頂ければ幸いです。

  • 別スレッドからメインダイアログのコントロールにアクセスする方法

    VC++2005 MFC WindowsXPを使用しています。 メインダイアログに作成したエディットボックスに フォーカスをセットしたいのですが、 別スレッドから行うにはどのようにすればよいのでしょうか? メインダイアログにあるボタンを押すと別スレッドの処理に入り、 その中でメインダイアログのコントロールを操作しようとしています。 //フォーカスをセット CWnd* MyEdit = ( CWnd* )this->GetDlgItem( IDC_EDIT1 ); MyEdit->SetFocus(); 宜しくお願い致します。

  • 【MFC】ユーザインタフェーススレッドのInitInstanceの呼ばれるタイミングについて

    現在、MFCのスレッドについて学習をしている者です。 タイトルの件なのですが、CWinThread の派生クラス内の InitInstanceが呼ばれるタイミングはいつなのでしょうか? AfxBeginThreadで生成した時すぐでしょうか? ご教示宜しく御願いいたします。

  • VC++ メインループでのイベント監視方法

    こんにちは。 VC++2008Expressでプログラムをしようと思っている初心者です。 以下、変な疑問があり、お尋ねしたいと思います。 よろしくお願いします。 Windowsアプリケーション Win32API クラスで別スレッドを作成して、そのスレッドからのイベントを WinMainループで受け取る方法ですが 通常皆様はどういう風にするのでしょうか? クラスは、その他のプログラムでも流用可能で様々なアプリに対応しやすいようにしあげたいのですが。。 別スレッドでイベント発生時にWinMainにどのように教えるのが普通のやり方なんでしょうか? 僕の考えでは、WinMain関数内のループ内で常時イベント発生していないか 以下のように監視させるか eventloop el; while(GetMessage(&msg,NULL,0,0)) {   TranslateMessage(&msg);   DispatchMessage(&msg);      if(el::boolEvent){     イベント処理へ   } } とするのが良いか? これだとクラスの関数、変数の使い方さえ分かるようにしておけば流用は簡単 なのかなと思いますが。。 メインのループ内にこんな監視を入れるようなプログラムをみたことないので ナンセンスなのではと思います。 次に考えられるのは、クラスのイベント発生で作成したSendMessageを送って メッセージ処理でイベント処理をさせるのが良いのかなって思いますが これだと、流用するときに対応したMessage(キュー?ですかね)を作成しないといけなく 私的に分かりにくいなーって思います。。。 変なことで悩んで先に進まないのですが、皆様はどのようにコーディングされるのでしょうか? ちなみにイベントというのは、RS232Cで受信があって、そのデータを加工したあとで メモリに格納して格納しましたよってイベントです。 どうかよろしくお願いします。

  • 重たい処理のタイムアウト強制終了

    ある重たい処理(正確には重くなる可能性がある処理)があります。たとえば、あるクラスAにあるpublic void method()がそれに該当するとします。 このメソッドを実行したいのですが、ある一定の時間が経過したら、タイムアウトとして、強制的に終了させたいという要望があります。 スレッドを使えば良いのかなとは思いました。しかし、ネットでスレッド関連の情報を検索しても、呼び出されるmethodのなかでループして、終了フラグを参照する類のサンプルばかりでした。ところが、クラスAは他者が提供したモジュールであるため、勝手に変更することが出来ません。 なにか良い方法はありますでしょうか?

    • ベストアンサー
    • Java
  • ゲーム画面の項目選択の結果を外部クラスが知るには

    ゲーム画面のある項目を選択すると、その値と画面を返すコードを作りたいです。 各画面は別クラスで以下のように同じselectItemメソッドを持っているものとします。 public class windowA { public int selectItem A() { return ret; } } 各ウィンドウは別の管理クラスXから抽象化して呼び出され クラスXがすべての結果を知るためにはどのような型、あるいはメソッドを用意するべきでしょうか?

    • ベストアンサー
    • Java
  • Android-画面更新

    メインの画面となるActivityから別クラスで作成したサービスを起動して、そのサービスの中でスレッドを動作させています。そのスレッドから画面のTextViewの文字の変更を行うには、sendBroadcastをActivityで受け取って、activityの中で文字変更を行わせるしかないのでしょうか。 なんだかとても面倒くさい作りなので、これが普通の作り方だと思えません。 スレッドからもっと簡単にTextViewの文字列の変更をする方法はありませんか? 2週間調べてもわからなかったので、具体的なコードを教えていただけると助かります。 よろしくお願いします。

    • ベストアンサー
    • Java