Form2のみを完全に終了するには?

解決


いいことあるさ  2010-02-05 09:20:54  No: 102215

現在Form1で条件を判別し、条件にマッチしたらForm2を起動し、Form1ではそのまま条件判別を実行するプログラムを考えています。
Form2ではForm1から渡されたパラメータで処理を起動し、その処理が指定された時間内に終了すれば正常終了の処理、規定の時間を過ぎれば異常終了の処理をForm2の中で実行します。下記がそのソースです(条件判別は省略)

Public Class Form1

      Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim fi2 As New Form2
        fi2.RunTime = 10
        fi2.PathPG = "c:\test.txt"
        fi2.Show()
    End Sub
End Class

Public Class Form2
    Friend RunTime As Long      '処理時間
    Friend PathPG As String     '処理のパス
    Private TimeSec As Long = 0 '経過時間の計算
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(PathPG)
        p.EnableRaisingEvents = True
        p.SynchronizingObject = Me
        AddHandler p.Exited, AddressOf p_Exited
        Timer1.Enabled = True
    End Sub

       'プロセスが終了したときに実行される
    Private Sub p_Exited(ByVal sender As Object, ByVal e As EventArgs)
        MsgBox("正常終了しました。") '本当は正常終了のログを出力するだけです
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        TimeSec = TimeSec + 1
        If TimeSec > RunTime Then
            Timer1.Enabled = False
            MsgBox("規定の時間ないに処理が終わりませんでした。")  '本当は異常終了したメールを飛ばします。
            Me.Close()
        End If
    End Sub
End Class

しかし、Form1のボタンを押してForm2を表示させ、Form2の閉じるを押してForm2を落としても指定の時間が経過するとメッセージが表示されます。
また、規定の時間がきてメッセージをOKしてForm2を落としても、プログラムを終了するとメッセージが・・・
完全にForm2の機能を閉じることはできないのでしょうか?
また、ほかに良い方法がありましたらよろしくお願いします


いいことあるさ  2010-02-05 09:30:28  No: 102216

開発環境を書き忘れていました。
VB2010で今テストをしています。


花ちゃん  2010-02-05 22:00:28  No: 102217

>完全にForm2の機能を閉じることはできないのでしょうか
Form2 の終了時の処理は、どのようになっているのでしょうか?
Timer1.Enabled = True  で起動したままになっていませんか?


特攻隊長まるるう  2010-02-06 01:04:23  No: 102218

ここは[VB掲示板(VB2-VB6専用)]で、VB2010は.NETですから板違いです。

VB2008 でテストしました。(コンパイルエラーは出なかったのでVB2010とのバージョン違いによる問題は無いと思います)

>Form1のボタンを押してForm2を表示させ、Form2の閉じるを押してForm2を落としても指定の時間が経過するとメッセージが表示されます。
「規定の時間ないに処理が終わりませんでした。」についてはデバッグ環境でのテストで表示されませんでした。
タイマーコントロールが破棄されているので、提示のコードだけなら表示されなくなる可能性が高いと思いますが。
まぁ、でも、花ちゃんの指摘通り、フォームを閉じる時にタイマー止めれば良いだけですが。

>また、規定の時間がきてメッセージをOKしてForm2を落としても、プログラムを終了するとメッセージが・・・
どちらのメッセージでしょう?

提示されたコードでは、「正常終了しました。」のメッセージについては
Form2 の有無とは関係なく、
規定の時間が来たという事とも関係なく、
プロセス終了時に常に表示されるようですが?
(この動作は、そのようにプログラムされているから当然では?)

そもそも、
>Form2のみを完全に終了する
という強制終了的な考え方に賛同できません。乱暴な考え方だと感じます。
Form2 は閉じられても非表示にしてプロセスの終了まで監視するけど、メッセージは表示しないとか、
プロセスの監視をやめるとか、
タイマーにしてもそうですが、ちゃんと後始末すべきなのでは?


いいことあるさ  2010-02-06 07:54:12  No: 102219

>>花ちゃんさん
レスありがとうございます。
Timerは起動したままです。
TimerはForm2で定義しているので、Form2を閉じたときに終了してほしいです。
終了しないとなるとForm2などでTimerで時刻などを表示していた場合は閉じる前にTimerをFalseにして終了しなければ、裏ではずっとTimerは起動しているということですか?
>>特攻隊長まるるうさん
レスありがとうございます。
>>ここは[VB掲示板(VB2-VB6専用)]で、VB2010は.NETですから板違いです。
すいません。間違っていました。
>>「規定の時間ないに処理が終わりませんでした。」についてはデバッグ環境でのテストで表示されませんでした。
>>タイマーコントロールが破棄されているので、提示のコードだけなら表示されなくなる可能性が高いと思いますが。
>>まぁ、でも、花ちゃんの指摘通り、フォームを閉じる時にタイマー止めれば良いだけですが。
そうですか、やはり後始末をちゃんとするべきですね・・・
>>どちらのメッセージでしょう?
("正常終了しました。") です
>>プロセス終了時に常に表示されるようですが?
そうなんですが?いろいろ調べて書いていましたのでそういうものとはしりませんでした。
自分はForm2を閉じた時点でForm2の変数などはすべて破棄されるものと思っていましたので何か破棄されないような記述がされているのかなと思っていました。


かいけつ  2010-02-23 04:09:54  No: 102220

かいけつ。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加