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

他のアプリケーションを起動した時

環境/言語:[win2000 Framework 1.1]
分類:[.NET]

いつもお世話になっております。
また、分からないところがでてきたので質問させていただきます。
現在、同一PC上に2つの作成したアプリケーションが起動していて、1つのアプリケーションから他のアプリケーションを起動し、終了するまで待機しているのですが終了した時に呼び出したフォームに戻らず、もう1つのアプリケーションの方がアクティブになり、呼び出し元のフォームがアクティブになりません。どなたかご教授お願い致します。
以下に、ソースを記述します。

// 外部アプリケーション起動 //
Private Sub cmdMaster_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmdMaster.Click

Dim t As System.Threading.Thread

Try
'// フォームを使用不可な状態に設定 //
frmMainForm.Enabled = False
'// マスタ編集アプリケーションを起動するスレッドを実行 //
t = New System.Threading.Thread( _
New System.Threading.ThreadStart( _
AddressOf MasterThread))
t.Start()
'// スレッドが終了するまで待機 //
While (t.IsAlive)
Application.DoEvents()
End While
Catch Ex As Exception

Finally
End Try

End Sub

Private Sub MasterThread()

Try
Dim p As System.Diagnostics.Process = _
System.Diagnostics.Process.Start
(System.IO.Path.Combine(gstrAppPath, "Master.exe"))

p.EnableRaisingEvents = True

AddHandler p.Exited, AddressOf p_Exited

Catch ex As Exception

End Try

End Sub

Private Sub p_Exited(ByVal sender As Object, ByVal e As EventArgs)

With frmMainForm
'// フォームを使用可能な状態に設定 //
.Enabled = True
End With

End Sub
Form.Activate()を呼び出すことでフォームをアクティブにすることができると思います。


ところで本題から外れ老婆心ながら、負荷をかけてしまうWhileを回す代わりに、負荷の少ないDelegate.BeginInvoke()やProcess.WaitForExit()などの利用を検討してみてはいかがでしょうか。
■No3240に返信(Codingslaveさんの記事)
> Form.Activate()を呼び出すことでフォームをアクティブにすることができると思います。

ありがとうございます。

>
>
> ところで本題から外れ老婆心ながら、負荷をかけてしまうWhileを回す代わりに、負荷の少ないDelegate.BeginInvoke()やProcess.WaitForExit()などの利用を検討してみてはいかがでしょうか。

Delegate.BeginInvokeとは、どういうことなのでしょうか?
> Delegate.BeginInvokeとは、どういうことなのでしょうか?
BeginInvoke()はデリゲートのメンバメソッドで、Threadクラスのように非同期にデリゲートの中のメソッドを呼び出すことができます。このメソッドの返り値であるIAsyncResultや、対になるEndInvoke()メソッドによってThreadクラスよりもスレッド間の同期をとるのに便利な機能を利用できます。


Whileを回す代わりに使えそうなものを単に列挙しただけで他意はありません(汗
> ところで本題から外れ老婆心ながら、負荷をかけてしまうWhileを回す代わりに、負荷の少ないDelegate.BeginInvoke()やProcess.WaitForExit()などの利用を検討してみてはいかがでしょうか。

もしThread.Startで別スレッドとして実行するのであれば、Whileでポーリングするのではなく、コールバックメソッドを使ってはどうでしょうか。

Thread.Startを使わないのであれば、Codingslaveさんがおっしゃっているような方法を代わりに使うのがよいでしょう。

(指摘するまでもないとは思いましたが、Thread.Startを使い、さらにProcess.WaitForExitなどを使うことになりやしないかと心配したもので...。)
■No3270に返信(管理人さんの記事)
>>ところで本題から外れ老婆心ながら、負荷をかけてしまうWhileを回す代わりに、負荷の少ないDelegate.BeginInvoke()やProcess.WaitForExit()などの利用を検討してみてはいかがでしょうか。
>
> もしThread.Startで別スレッドとして実行するのであれば、Whileでポーリングするのではなく、コールバックメソッドを使ってはどうでしょうか。
>
> Thread.Startを使わないのであれば、Codingslaveさんがおっしゃっているような方法を代わりに使うのがよいでしょう。
>
> (指摘するまでもないとは思いましたが、Thread.Startを使い、さらにProcess.WaitForExitなどを使うことになりやしないかと心配したもので...。)

実際にどのようにしたら一番最善の方法なんでしょうか?
なるべく負荷がかからないよう作成していきたいのでよろしくお願い致します。
よくよく考えてみると、なぜ別スレッドにしているのか、その理由が分かりません。普通にExitedイベントを受け取ったところで、プロセス終了後の処理をすればよいように思われますが。
■No3279に返信(管理人さんの記事)
> よくよく考えてみると、なぜ別スレッドにしているのか、その理由が分かりません。普通にExitedイベントを受け取ったところで、プロセス終了後の処理をすればよいように思われますが。

参考にしていた書籍にサンプルが掲載されていたので、このように作成したのです。
他によい方法があるのでしょうか?
> 参考にしていた書籍にサンプルが掲載されていたので、このように作成したのです。
> 他によい方法があるのでしょうか?

つまり、なぜ次のようなコードではダメなのでしょうか?わざわざマルチスレッドにしている意味が分からないのですが。

Private Sub cmdMaster_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmdMaster.Click
'// フォームを使用不可な状態に設定 //
frmMainForm.Enabled = False

Dim p As System.Diagnostics.Process = _
System.Diagnostics.Process.Start
(System.IO.Path.Combine(gstrAppPath, "Master.exe"))

p.EnableRaisingEvents = True

AddHandler p.Exited, AddressOf p_Exited
End Sub

Private Sub p_Exited(ByVal sender As Object, ByVal e As EventArgs)

With frmMainForm
'// フォームを使用可能な状態に設定 //
.Enabled = True
End With

End Sub
■No3299に返信(管理人さんの記事)
> つまり、なぜ次のようなコードではダメなのでしょうか?わざわざマルチスレッドにしている意味が分からないのですが。
>
> Private Sub cmdMaster_Click(ByVal sender As System.Object, _
> ByVal e As System.EventArgs) Handles cmdMaster.Click
> '// フォームを使用不可な状態に設定 //
> frmMainForm.Enabled = False
>
> Dim p As System.Diagnostics.Process = _
> System.Diagnostics.Process.Start
> (System.IO.Path.Combine(gstrAppPath, "Master.exe"))
>
> p.EnableRaisingEvents = True
>
> AddHandler p.Exited, AddressOf p_Exited
> End Sub
>
> Private Sub p_Exited(ByVal sender As Object, ByVal e As EventArgs)
>
> With frmMainForm
> '// フォームを使用可能な状態に設定 //
> .Enabled = True
> End With
>
> End Sub
>
まだまだ未熟ですいません。これからもっと勉強していきたいと思います。
また、不明な点等が発生した場合、ご迷惑をおかけすると思いますがよろしく
お願いいたします。
解決済み!

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