- PR -

NotifyIconでのバルーン表示について

投稿者投稿内容
べん吉
会議室デビュー日: 2009/04/02
投稿数: 9
投稿日時: 2009-04-02 18:59
VisualStudio2008でFramework2.0のアプリケーションを開発しております。

FormにNotifyIconを貼り付け、常駐プログラムを作成しております。
複数のフォルダをSystem.Threading.Timerを使用して監視してます。
※フォルダ数の数だけTimerを生成しています。

Timerのコールバック関数内で例外エラーが発生した場合に、NotifyIconの
Balloon表示を行いたいと思っております。

このような場合、メインスレッド以外のスレッドからFormのNotifyIconを
操作する事になるのでしょうか?

現在、UnhandledExceptionイベントを追加し、FormのNotifyIconを直接参照
してバルーン表示までできたのですが、その後にエラーが発生してしまいます。
※終了するとエラーは表示されないのですが、処理継続させようとしています。

エラー:"問題が発生したため、XXXXXXを終了します。ご不便を〜"

実装方法に問題があるのかご教授願えたらと思います。

宜しくお願い致します。
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2009-04-03 09:29
引用:

エラー:"問題が発生したため、XXXXXXを終了します。ご不便を〜"



これは例外が処理されなかったときに発生するメッセージで、ここからはエラーの原因はわかりませんので、発生した例外の詳細を調べるのが最優先だと思います。ただし、実行ファイルから起動したときにはこれが出ますが、デバッガで実行している場合はデバッガが停止して例外の詳細情報を知ることができたと思います。(デバッガの設定によりますが)

少なくとも UnhandledException にブレークポイントを置けばとまってくれると思います。

引用:

このような場合、メインスレッド以外のスレッドからFormのNotifyIconを
操作する事になるのでしょうか?


UnhandledException はワーカースレッドで実行されるわけではありませんから、これは関係ないように思います。

引用:

複数のフォルダをSystem.Threading.Timerを使用して監視してます。


FileSystemWatcher という便利なコンポーネントもありますが、検討済みですか?
べん吉
会議室デビュー日: 2009/04/02
投稿数: 9
投稿日時: 2009-04-03 10:01
ありがとうございます。

引用:

複数のフォルダをSystem.Threading.Timerを使用して監視してます。
引用:

FileSystemWatcher という便利なコンポーネントもありますが、検討済みですか?





FileSystemWatcherも検討しましたが、下記の理由でTimerに変更しました。

1) 通知回数やタイミングが更新方法で違うので、対応が複雑(?)になる。
2) 通知受け後の処理で異常終了した場合、リカバリするタイミングが
  複雑と思われたため。
3) System.Threading.Timer も軽く動作する。

相当悩みました。

実行時のエラーについては、もっと追ってみます。
べん吉
会議室デビュー日: 2009/04/02
投稿数: 9
投稿日時: 2009-04-03 11:37
引用:

テッテさんの書き込み (2009-04-03 09:29) より:
引用:

エラー:"問題が発生したため、XXXXXXを終了します。ご不便を〜"



これは例外が処理されなかったときに発生するメッセージで、ここからはエラーの原因はわかりませんので、発生した例外の詳細を調べるのが最優先だと思います。ただし、実行ファイルから起動したときにはこれが出ますが、デバッガで実行している場合はデバッガが停止して例外の詳細情報を知ることができたと思います。(デバッガの設定によりますが)

少なくとも UnhandledException にブレークポイントを置けばとまってくれると思います。




デバッガで詳細を見てみましたが、
"Exceptionはハンドルされませんでした"でした。

UnhandredExceptionのイベントでは正しくブレークできるのですが・・・
また別のExceptionを意味しているのでしょうか?

宜しくお願いします。
セラフ
ベテラン
会議室デビュー日: 2005/12/01
投稿数: 95
お住まい・勤務地: 東北の顔の形といえば
投稿日時: 2009-04-03 11:46
引用:

べん吉さんの書き込み (2009-04-03 11:37) より:

デバッガで詳細を見てみましたが、
"Exceptionはハンドルされませんでした"でした。



えっと・・・InnerExceptionに何かはいってませんか?
べん吉
会議室デビュー日: 2009/04/02
投稿数: 9
投稿日時: 2009-04-03 11:56
引用:

セラフさんの書き込み (2009-04-03 11:46) より:
引用:

べん吉さんの書き込み (2009-04-03 11:37) より:

デバッガで詳細を見てみましたが、
"Exceptionはハンドルされませんでした"でした。



えっと・・・InnerExceptionに何かはいってませんか?



確認してみましたが、nullになってます。

今、Timerイベントで無理やりExceptionをThrowして、UnhandedExceptionでキャッチしています。
バルーン表示されてすぐエラーになってます。
バルーン表示してEnvironment.Exit()すればエラー出ず終了できるのですが・・・
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2009-04-03 12:49
状況がいまいちわからないのですが・・・

まず、UnhandedException 内にブレークポイントを置いてデバッガで中断させますよね。そこからステップ実行していくと、どこかで例外が発生するのでしょうか?

もしそうならその部分のコードと、どの行で例外が発生するのかを教えてください。

それともそういう意味ではなく、デバッガでは例外が発生しないのに実行ファイルから直接起動すると「問題が発生したため...」のメッセージが表示されるということでしょうか?

[追記]
もし後者なら、Windows のイベントビューアのアプリケーションログを見てみるとエラーの情報が得られるかも知れません。
[/追記]

[ メッセージ編集済み 編集者: テッテ 編集日時 2009-04-03 12:52 ]
セラフ
ベテラン
会議室デビュー日: 2005/12/01
投稿数: 95
お住まい・勤務地: 東北の顔の形といえば
投稿日時: 2009-04-03 13:28
単純にUnhandledExceptionイベントの中で
コード:
e.ExitApplication = False

してないなんて事はありませんよね?

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