イベントハンドラ処理が終了しているかどうかの確認方法

このQ&Aのポイント
  • イベントハンドラ処理が終了しているかどうかを確認する方法について知りたいです。
  • 特定のイベントハンドラ処理が最後まで終了しているかどうかを確認するには、デバッグツールを利用する方法があります。
  • デバッグツールを使用することで、イベントハンドラ処理が正常に終了しているかどうかを確認することができます。
回答を見る
  • ベストアンサー

イベントハンドラ処理が終了しているかどうかを確認するには?

イベントハンドラ処理が終了しているかどうかを確認するには? 前回以下のページにて「c#でボタンのアクションが終わった後に再度同じ動作をさせるには?」 という質問をしました所、イベントハンドラ処理が終了していないのでは?という回答を頂きました。 http://okwave.jp/qa/q5833308.html しかし、残念ながら当方初心者の為、 デバッガを利用して 「LoadData()処理」や「ボタンのClickイベントに対応付けしたイベントハンドラ処理」が  ・ちゃんと最後まで終了しているか  ・無限ループに陥っていないか  ・IO入力待ちで止まっていないか というのをどのように確認してよいかすらわかりません。 どうすれば確認できるのでしょうか? 何か参考になるページなどでも結構ですので教えてください。 よろしくお願いします。

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

  • ベストアンサー
  • rk_les
  • ベストアンサー率63% (23/36)
回答No.2

おはようございます。 イベントハンドラ終了直前にメッセージボックスなどで”終了です”などをおいてやりましょう。 Debug.Printなどで出すのもいいですね。 後は根本的なことですがButtonなどのイベントを回すべきではありません。処理をメソッドにしそれを回してやりましょう。

その他の回答 (2)

  • rk_les
  • ベストアンサー率63% (23/36)
回答No.3

連投申し訳ございません。 ただいまリンク先を拝見いたしました。 >後は根本的なことですがButtonなどのイベントを回すべきではありません。処理をメソッドにしそれを回してやりましょう。 これについて出来ていたようですね・・・失礼いたしました。

master817199
質問者

お礼

とんでもありません、ご回答に感謝します。 メッセージボックスの設定を早速実行してみようと思います。

回答No.1

C#というのは具体的にはどんな環境ですか? 「Visual C#」なら、イベントハンドラ内の適当なところにブレークポイントを設定してデバッグメニューから実行をすれば、ボタンを押した直後にブレークポイントの場所で止まるので、そこからステップ実行等で動作を見ていけば良いだけです。 (イベントハンドラの最後にブレークポイントを設定して、そこまで来るかというのを見るのが手っ取り早いかもしれませんが)

master817199
質問者

お礼

visual c#です わかりやすい解答ありがとうございます。

関連するQ&A

  • 【VC++6.0】イベントハンドラ関数を流用したいのですが、、、

    VC++超初心者です。 既出の質問(http://okwave.jp/qa2658942.html)と同様ですが、VC2005(CLR)でなく、VC++6.0の時 どのようにコーディングすればよいか教えていただけませんでしょうか。 よろしくお願いします。 ********************************** 以下の2つのボタンのイベントハンドラ関数があった場合 //ボタン1のイベントハンドラ関数 void CAAAADlg::OnOK() { 処理内容 } //ボタン2のイベントハンドラ関数 void CBBBBDlg::OnOK() { } ボタン2をクリックしたときの動作とボタン1の動作を同じにしたいと思っています。 **********************************

  • C# イベント処理について

    GUIなどの処理はイベントというのを使っていますが、イベントの実際の内部処理は一体どんな仕組みで動いているのでしょうか。  単純に無限ループをして状態が変化しているかチェックしているのでしょうか。 例えばボタンが2つあり、マウスが上に来たらボタンの色を反転させるイベントは、マウスと2つのボタンの当たり判定を監視し、繰り返す。という感じなのでしょうか。 (ということはボタンの数やボタン自体のイベントが増えれば負荷も増えてしまう?)

  • イベントハンドラ関数について

    現在VC++/CLR 2005 でプログラミングをしています。 基本的な事柄かもしれませんが、質問させてください  以下の2つのボタンのイベントハンドラ関数があった場合 //ボタン1のイベントハンドラ関数 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) String^ str = textBox1->Text } //ボタン2のイベントハンドラ関数 private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { } ボタン2をクリックしたときの動作とボタン1の動作を同じにしたいと思っています。 その場合は private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) String^ str = textBox1->Text } //ボタン2のイベントハンドラ関数 private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { String^ str = textBox1->Text } のようにボタン2のイベントハンドラ関数をボタン1と同じように書けばいいのですが イベントハンドラ関数の処理が膨大になった場合を考えて省略する 書き方は無いのでしょうか?(以下の場合ですとエラーが起こってしまいます。) private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { button1_Click(); } 宜しくお願いします

  • イベントハンドラに処理を追加するには?

    例えばbodyタグのonloadイベントハンドラに JavaScriptを使って処理を追加するにはどうすればよいのでしょうか? 例) ・rei.htm <html>  <script language="JavaScript" type="text/javascript">  function hoge(){   alert("hogeです");  }  function foo(){   alert("fooです");  }  </script>  <body onload="hoge();">  </body>  <script language="JavaScript" type="text/javascript">  document.body.onload += foo();  </script> <html> ※前提条件として、変更可能な箇所はscriptタグ内のみとなります。 「こんなんでいけないかな?」と思って上記のようにやってみたのですがうまくいきませんでした。 (結果はfoo()のみ実行され、hoge()は実行されませんでした。 alertでbody.onloadの中身を確認すると『function anonymous{hoge();}undefined』と表示されるので、なぜfoo()が実行されてhoge()が実行されないのかよくわかりませんが‥) また試しに document.body.onload += foo(); これを以下のように変更してみました。 document.body.onload = foo(); この時は、 ・foo()の実行  ↓ ・javascriptエラー  ↓ ・hoge()の実行 となりました。(これもなぜこうなるのかよくわかりせん) 以上、イベントハンドラに最初から任意に入れられている処理を残しつつ、 さらに処理を加えるにはどうすればよいのかご教示お願いします。

  • イベントの発生から対応する処理実行までの作り方

    以前に、ボタンクリックなどのイベントが起きたら すぐにそのボタンクリックに対応した処理をその場(イベント ハンドラ)で実行するのではなく、 "イベントが発生しました関数"のようなものに最初に イベント情報を渡してしまい、あとはその関数からイベントが 振り分けられていき、最終的にそのイベントに対応した処理が 実行される。といったプログラムを見たことがあるのですが、 このような技法は一般的に行われるものなのでしょうか? 巨大なプログラムになるとこのような技法が使われる気が しますが・・・ また、この技法には何か名前がついているのでしょうか? また、これに関して記載しているサイト・書籍などありましたら 教えてください。

  • イベントの取りこぼしについて

    教えて下さい。 VBで構築したアプリケーションにおいて、無限ループ内で処理を判断し、実行するようなプログラム構築にしています。この無限ループ内に「DoEvents」をセットしています。これによりOSに溜まっている、各イベントを処理していると思うのですが、処理するイベントに取りこぼしは発生しないのでしょうか? 現在、A/Dボードを実装しており、2ms周期でVBのイベントが発生するようなソフトになっています。「DoEvents」実行時に、OS側が処理に要する時間は、キューに溜まっているイベント数×1回のイベント処理時間で単純に導けるものでしょうか? また、CPUのスペックを2倍にすると、単純に処理時間は半分と計算できるものでしょうか?

  • ウィンドウを閉じたときのイベント処理

    「onUnload」でイベント処理を記述すると、ページを移動したときにも処理が行われますが、ウィンドウを閉じたときだけ処理を行いたい場合のイベントはどのように記述すればよいでしょうか? メインウィンドウからリンクをかけて、サブウィンドウを表示させ、そのサブウィンドウ内で何ページかリンクページを設定していますが、サブウィンドウ内でのページ移動中はそのままで、サブウィンドウを閉じてメインウィンドウに戻るときだけ、確認ウィンドウを1ページ表示させたいのです。 よろしくお願いします。

  • FocusLostでイベント処理を中断させたい

    TextFieldでフォーカスを失った時に 入力値をチェックするプログラムがあります。 入力値が不正な場合、メッセージを表示します。 また、終了ボタンで終了するか確認するメッセージを 表示します。 このとき、TextFieldに不正な値を入力し、 終了ボタンを選択するとメッセージが2回表示されます。 TextFieldのFocusAdapterのFocusLost処理により、 他のイベント処理をさせないようにしたいのですが、 戻り値がvoidということもあり、 制御でなきないのでしょうか? よい方法はありますか? キーイベントとマウスイベントで フォーカスのあるコンポーネントを保持し、 変更されたら入力値チェックを行う。 と考えてみましたが、何か問題が起きてしまいそうで。 よろしくお願いします。

  • MFC - ボタンの処理について

    現在MFCを用いてWebカメラからのキャプチャを行うソフトを作成しています。 環境はVisual Studio 2005です。 ソフトウェアはダイアログ形式で、”Capture"と"停止"のボタン、そして1つPictureControlを配置し、"Capture"ボタンが押されたらWebカメラからの映像をPictureControlに表示し、"停止"ボタンが押されたらキャプチャを終了するというものです。 少し長くなってしまうのですがよろしくお願いします。 開発当初、ダイアログクラスのメンバ変数にbool型の Cap_Flag を追加し、コンストラクタにより初期値を false に設定するようプログラムを組みました。 そして "Capture"ボタンが押され、そのイベントハンドラが呼び出された時に、 Cap_Flag を true に設定しキャプチャを行う関数を実行するようにしました。 キャプチャを行う関数の中では、 Cap_Flag をチェックし true に設定されている間キャプチャを行うよう while( Cap_Flag == true ) としてキャプチャを行います。 その後 "停止"ボタン が押されれば、そのボタンに対するイベントハンドラ内で Cap_Flag に false を設定し、キャプチャを終了しようと考えました。 この設計では確かに "Capture"ボタンが押されればキャプチャが行われ、PictureControlに映像が表示されるのですが、これらのキャプチャ処理は "Capture"ボタン のイベントハンドラ内で実行しているため、キャプチャを行っている間、つまり while( Cap_Flag == true ) となっている間は永遠に実行状態になっているため "Capture"ボタン が押されっぱなしの状態になり、"停止"ボタンを押すことが出来なくなってしまいます。また無理に "停止"ボタン を押そうとすると固まってしまうため、うまく"Capture"と"停止"を行うことが出来ない状況です。 改善策として、オリジナルのメッセージを作成しメッセージマップでそのオリジナルの命令に対してキャプチャを行う関数が呼び出されるよう設定しました。よって、 "Capture"ボタンが押されたときに呼び出されるイベントハンドラ内で Cap_Flag を true に設定し、オリジナルのメッセージを送信して、そのメッセージに対応するキャプチャを行う関数を呼び出すようプログラムを組みなおしました。 このように組みなおした理由は、"Capture"ボタンが押されたときに呼び出されるイベントハンドラ内の処理は、Cap_Flag を true に設定することと、オリジナルのメッセージを送信することのみで、イベントハンドラ内ではキャプチャを行う関数は実行されず、 実際に "Capture"ボタン が押されたとしても、押された状態ではなくすぐに基の状態(表示)にもどるだろうと考えたためです。 ですが、このように変更しても "Capture"ボタンのイベントハンドラ内でキャプチャ処理を行っていることと同様に "Capture"ボタンが押されっぱなしの状態になり、"停止"ボタンを押すことが出来ません。 どのようにプログラムを組めば、実際にキャプチャを行っている間でも、"Capture"ボタンが押された状態にならず "停止"ボタン を押すことができるようになるでしょうか? 参考になるアドバイス、またはウェブページをご紹介いただけれたらと思います。 よろしくお願い致します。

  • 無限ループ中におけるマウスイベント処理について

    import java.awt.*; import java.awt.event.*; //他のインポートは省略。 public class Test extends Frame {  public static void main(String[] args) {   new Test();  }  public Test() {   //フレームの基本設定は省略。   enableEvents(AWTEvent.MOUSE_EVENT_MASK);   show();   mainLoop();  }  private void mainLoop() {   while(true) {    //処理は省略。   }  }  public void processMouseEvent(MouseEvent e) {   //処理は省略。  }  //他のメソッドは省略。 } こんな感じのプログラムを作ったのですが、mainLoop メソッドの無限ループにはまって何もできなくなるはずが、 なぜか普通にマウスイベント処理ができたので不思議に思っております。 VB などで同じようなプログラムを作るときは無限ループの最後に DoEvents でイベント処理をさせております。 言語仕様なのか自分の使ってる PC や OS など環境のせいなのが気になっております。 Java 言語に詳しい方、もし何かご存知でしたら教えて下さい。 (なお、省略した部分は普通の計算処理とかなので影響はないと思われます。)

    • ベストアンサー
    • Java

専門家に質問してみよう