DOBON.NET DOBON.NETプログラミング掲示板過去ログ

VB.NETのプログラムがプロセスに残る・・・

環境/言語:[Windows2000 VB.NET]
分類:[.NET]

まだまだVB.NET初心者のchopinです。

いままでいくつかプログラムを作ってきたのですが、
プログラムを終了させてもプロセスに残ってしまいます。
Handles MyBase.Closing
を使って自分なりにクローズ処理を行ってるつもりなのですが(・-・;)
原因としてなにが考えられるかご教授お願いしますですm(._.)m
> いままでいくつかプログラムを作ってきたのですが、
> プログラムを終了させてもプロセスに残ってしまいます。

では、終了していないのでしょう。
Windowsアプリケーションの終了要件は、
Mainメソッドを抜けることです。
で、通常は、

Public Shared Sub Main() ' モジュール内での記述の場合はSharedは不要
Application.Run(New Form1())
End Sub

のような形で、プログラムが実行され、Form1が表示されます。
このとき、処理はApplication.Runを実行中です。

このようにプログラムを開始している場合は、Form1がCloseされた時点で
(ユーザがウィンドウの右肩の「X」ボタンで閉じる、コーディングでCloseメソッドを呼ぶなどをし、Closingイベントで閉じるのをキャンセルしなかった場合)、
内部でApplication.Exitメソッドが呼ばれ、
Application.Runの実行が終了し、Mainメソッドを抜けるのでプログラムが終了します。

というわけで、プログラムはどのように開始していますか?
Mainメソッドを自分で書いている場合は、その内容次第です。
自分では書かずに「スタートアップの指定」でいずれかのFormを指定している場合は、
上記の理由より、そのスタートアップフォームを閉じましょう。


> Handles MyBase.Closing
> を使って自分なりにクローズ処理を行ってるつもりなのですが(・-・;)
> 原因としてなにが考えられるかご教授お願いしますですm(._.)m
もしも、複数のスレッドを使用するコーディングをしているならば、IsBackgroundプロパティがfalseに設定されているThreadがループ(あるいはデッドロック)していないかどうかも確認してみてください。
これらのスレッドが終了していない場合、プロセスは終了しません。IsBackgroundプロパティがtrueに設定されていればプロセス終了時に中断されますが、そうでない場合はこれらのスレッドが終了するまでプロセスの終了は待機されます。
よねKENさん、ありがとうございます〜

プログラムの開始方法ですが、
モジュール内でSubMainを使用して開始しています。
ご教授頂いたのとまんま一緒の起動の仕方をしています。
Application.Run(new Form1())
って感じです。終了時はClosingイベントを拾っているので、
Application.Exit()
を呼び出して終了させていますが、終了してくれません。・゚・(ノД`)・゚・。
Codingslaveさんありがとうございます〜

> もしも、複数のスレッドを使用するコーディングをしているならば、IsBackgroundプロパティがfalseに設定されているThreadがループ(あるいはデッドロック)していないかどうかも確認してみてください。
> これらのスレッドが終了していない場合、プロセスは終了しません。IsBackgroundプロパティがtrueに設定されていればプロセス終了時に中断されますが、そうでない場合はこれらのスレッドが終了するまでプロセスの終了は待機されます。

複数のスレッドを動かしまくってます(・−・;)
えっとまだまだ知識が乏しくてIsBackgroundプロパティとかいじったことないのですが、
ちょっと調べたんですが、これは複数のスレッドにTrueと設定していいのでしょうか?
また、ループ、デッドロックで気になったのですが、
スレッドの中で、
Thread1 = New System.Threading.Thread(AddressOf ThreadSub)
Thread1.Start()
みたいな感じでスレッドを起動させて、ループ作業をさせているのですが、
(つまりThread0がThread1を起動させてThread1がThread0を起動させるみたいな感じです)
この場合はCloseイベント(右上の×ボタン押したり)を拾って、故意にスレッドを終了させないと
まずいでしょうか?(・−・;)
スレッドが20以上あり、Closeingイベントとかで、どのスレッドが起動してるか判定し、
Abortを送ったほうがいいとは思ったんですが、手を抜いてしまって(・−・;)

ちょっと、話がそれてしまったかもしれませんがよろしくお願いしますですm(._.)m
> えっとまだまだ知識が乏しくてIsBackgroundプロパティとかいじったことないのですが、
> ちょっと調べたんですが、これは複数のスレッドにTrueと設定していいのでしょうか?
プロセス終了とともにAbortさせても問題がない場合にはTrueを設定してください。

> この場合はCloseイベント(右上の×ボタン押したり)を拾って、故意にスレッドを終了させないと
> まずいでしょうか?(・−・;)
前述したようにIsBackgroundがFalseのスレッドはプロセスの終了をブロックしてしまうようです。またIsBackgroundがTrueの場合、どこで中断されるか予想がつかないので万全を期すなら確実に終了させておくべきです。たとえばスレッド内で、通信中のソケットなど終了の前に適切な処理をしなければならないようなリソースを処理している場合などはFalseにして必要な処理を終えるまでプロセスを待たせるようにしておくべきです。

DOBON.NET | プログラミング道 | プログラミング掲示板