- PR -

アプリケーション終了時の処理について

投稿者投稿内容
みかん
常連さん
会議室デビュー日: 2006/08/08
投稿数: 31
投稿日時: 2007-04-24 09:40
すみません。自己解決しました。。。
申し訳ありませんでした。

---

いつもお世話になっております。

アプリケーション終了時に処理Aを実行させたいので、下記のように
コーディングしました。

Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
 処理A
  MessageBox.Show("アプリケーションが終了されます。")
End Sub

ところが、タスクマネージャーやAlt + F4で終了させると
MessageBoxは毎回表示されるのに、
処理Aは実行される時としない時があり、原因がわかりません。
処理Aではクラスをインスタンス化してログを出力させています。
確実に処理Aを実行させるにはどのようにしたらよいでしょうか?

ご教授よろしくお願い致します。
環境は下記の通りです。
Windows XP Professional Version 2002 SP2
Visual Studio 2005 Professional Edition
.NET Framework Version 2
使用言語 vb.net



[ メッセージ編集済み 編集者: みかん 編集日時 2007-04-24 10:09 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-04-24 10:52
引用:

みかんさんの書き込み (2007-04-24 09:40) より:

すみません。自己解決しました。。。
申し訳ありませんでした。


どのように解決したのでしょうか?
ApplicationExit イベントにしたとか、そういうことでしょうか。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
みかん
常連さん
会議室デビュー日: 2006/08/08
投稿数: 31
投稿日時: 2007-04-24 12:04
ロジックの問題ではなくて、システムの仕組みの問題でした。
処理Aは毎回実行されていました。
申し訳ありません。

ただ、今、別の問題で頭を悩ませています。
Closingイベントが発生した後、同じFormClassの処理Bを実行し、処理Bが
終わるまでアプリケーションの終了を待たせたいのです。
処理Bは他のプロセスとのメッセージのやりとりを数回繰り返します。
メッセージ送信、受信を繰り返す形です。
Closingイベント内でSleepやWhile文を試してみましたが、処理Bもとまって
しまいました。

何か方法はありますでしょうか?
ご教授よろしくお願い致します。

KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-04-24 16:29
引用:

みかんさんの書き込み (2007-04-24 12:04) より:

Closingイベントが発生した後、同じFormClassの処理Bを実行し、処理Bが
終わるまでアプリケーションの終了を待たせたいのです。



普通に処理Aの呼び出しの後に、処理Bの呼び出しを書けば
処理Bが終わるまではフォームは閉じないと思いますが、そういう話ではないのですか?
大ベテラン
会議室デビュー日: 2006/06/28
投稿数: 116
投稿日時: 2007-04-24 23:33
メッセージ送受信の処理がSleepでとまるということは、1メッセージ送信ごとにスレッドなどのイベントを発生させて
動作するようになっているのではないでしょうか。
そうであれば、whileなどでループしている間に、イベントの実行を指示してやれば上手く行かないでしょうか?

メッセージ送信は、こちら側に送信する情報が残っている間、時々イベントを実行させながら
待つというようにすれば良いと思いますが、受信はどうなのでしょうか。
メッセージの送信に対するレスポンスであれば待つのはさほど難しくないと思いますが。
そうでないなら、アプリケーションが終了するのにそもそもメッセージを確実に受信する必要も無いように思えます。
みかん
常連さん
会議室デビュー日: 2006/08/08
投稿数: 31
投稿日時: 2007-04-26 19:39
ご教授ありがとうございます。
暁さんのおっしゃるとおり、Closingの中で一連の処理を行えばうまく行きそうです。
ただ、メッセージ(送信メッセージに対するレスポンス)受信の
イベントを待っている間にClosingが終わってしまいます。
メッセージを受信しないと、処理Bは正常動作できません。

「メッセージの送信に対するレスポンスであれば待つのはさほど難しくない」
とのことですが、ぜひ方法を教えてくださいませんか?

メッセージ送信(一回目)以降は、メッセージ受信(キューの受信イベント)発生後に
タイマーを起動しタイムアウトしたら次のメッセージを送信する、を繰り返します。
メッセージ送信→
メッセージ受信(キューの受信イベント)→
タイマー設定→
タイムアウト→
次のメッセージ送信

の繰り返しです。

よろしくお願い致します。

[ メッセージ編集済み 編集者: みかん 編集日時 2007-04-26 19:43 ]
大ベテラン
会議室デビュー日: 2006/06/28
投稿数: 116
投稿日時: 2007-04-27 21:45
引用:

みかんさんの書き込み (2007-04-26 19:39) より:
ただ、メッセージ(送信メッセージに対するレスポンス)受信の
イベントを待っている間にClosingが終わってしまいます。


「キューの受信イベント」が何かは分かりませんが、
メッセージ送信をトリガーとして、受信イベントに関する何かを管理するキューに
情報が入るのですよね。
であれば、メッセージ受信のイベントを待っている間にはキューに情報があるわけですから
キューが空かどうかで判断できるように思います。

「メッセージの送信に対するレスポンスであれば待つのはさほど難しくない」
と書いた理由を書き忘れていたので追記しますが、
送信と受信が1対1で対応するのであれば送信件数=受信件数になるはずだからです。

Sleepを入れるかどうかで、送信を待たずに終わったり止まったりするということから
送信部分も同一アプリ内にあると想像しました。
もちろん想像だけですから、そうではないかもしれませんし
私の想像できていない上手く行かない理由もあるのかもしれません。

[ メッセージ編集済み 編集者: 暁 編集日時 2007-04-28 12:49 ]
みかん
常連さん
会議室デビュー日: 2006/08/08
投稿数: 31
投稿日時: 2007-05-12 22:56
ご回答ありがとうございました。

結論としては、Closingイベントをキャンセルして処理Bを実行し、
処理Bが終了した後でClosingイベントを自分で発生させることにしました。

いろいろと参考になりました。
ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)