C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: VS2005 VB.NET 二重起動防止について


(過去ログ 47 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■25435 / inTopicNo.1)  VS2005 VB.NET 二重起動防止について
  
□投稿者/ ラン (1回)-(2008/09/19(Fri) 13:02:16)

分類:[.NET 全般] 

VS2005 VB.NET 二重起動防止について

VS2005 VB.NETにて開発中です。
同じExe内の親画面から子画面を呼び出す際に、二重起動防止を入れたいのですが、どうすればよいのか教えてください。

親画面@→子画面Aを起動
@に戻る。再度、子画面Aを起動
二重起動防止のチェックを行い、既にAが起動されている場合は、
既存のAをCloseし、新しいAを起動する。

という処理を行いたいと思っています。
Mutexで制御することができるのでしょうか?

ちなみに・・・下記のソースをAのForm_Loadに入れてみましたが、チェックできませんでした。

Dim mutex As New System.Threading.Mutex(False, Me.ProductName & Me.Name)
' 既にMutexが取得されていないか確認する
If Not mutex.WaitOne(0, False) Then

' 既に取得されている場合
Console.WriteLine("アプリケーションは既に起動しています。")

End If

'アプリケーションが終わるまでmutexへの参照を維持するようにする
GC.KeepAlive(mutex)



どなたかよろしくお願いいたします。m(_ _)m

引用返信 編集キー/
■25437 / inTopicNo.2)  Re[1]: VS2005 VB.NET 二重起動防止について
□投稿者/ よねKEN (192回)-(2008/09/19(Fri) 13:15:59)
1つのEXEの親画面と子画面の話なんですよね?親画面が子画面の状態を管理して、
子画面を開くときにはまず既に子画面の有無をチェックして、あれば閉じる処理を行えばよいと思います。
引用返信 編集キー/
■25438 / inTopicNo.3)  Re[1]: VS2005 VB.NET 二重起動防止について
□投稿者/ ロック (99回)-(2008/09/19(Fri) 13:16:25)
シングルトン?
これかな?
http://dobon.net/vb/dotnet/form/singleform.html

引用返信 編集キー/
■25439 / inTopicNo.4)  Re[1]: VS2005 VB.NET 二重起動防止について
□投稿者/ たくボン (26回)-(2008/09/19(Fri) 13:22:23)
No25435 (ラン さん) に返信
> 同じExe内の親画面から子画面を呼び出す際に、二重起動防止を入れたいのですが、どうすればよいのか教えてください。
おなじExe内で多重起動を制御したいなら、変数にすればよいのでは?

Form1(親画面)、Form2(子画面)とすると、

Public Class Form1
    Private frmChild As Form2

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If Not frmChild Is Nothing Then
            frmChild.Close()
            frmChild = Nothing
        End If
        frmChild = New Form2
        frmChild.Show()
    End Sub
End Class


ちなみに、Mutexを使うのは自身のプロセスの多重チェックをする場合などに使えばいいかな。こんな感じで。
Imports System.Threading

Public Class MultiplexRunBlocker
    Private Shared _mutex As Mutex

    <STAThread()> _
    Public Shared Sub Main()
        _mutex = New Mutex(False, My.Application.Info.AssemblyName)

        If Not _mutex.WaitOne(0, False) Then
            MessageBox.Show("多重起動はできません")
            Return
        End If
        Application.Run(New MainFrom())
    End Sub
End Class


引用返信 編集キー/
■25440 / inTopicNo.5)  Re[2]: VS2005 VB.NET 二重起動防止について
□投稿者/ たくボン (27回)-(2008/09/19(Fri) 13:27:31)
No25438 (ロック さん) に返信
> シングルトン?

Singletonの場合は、インスタンスが存在する場合はそのインスタンスを返却するのが一般的だと思うので、今回のような画面をCloseして再度生成とは違うんじゃないかな?
ちなみに、チーム開発でSingletonを書く場合は、DefaultProperty属性と併用してます:-)
引用返信 編集キー/
■25442 / inTopicNo.6)  Re[2]: VS2005 VB.NET 二重起動防止について
□投稿者/ ラン (2回)-(2008/09/19(Fri) 13:41:51)
No25439 (たくボン さん) に返信
たくボンさんに教えていただいた、

> If Not frmChild Is Nothing Then
> frmChild.Close()
> frmChild = Nothing
> End If
> frmChild = New Form2
> frmChild.Show()

で解決いたしました!
ありがとうございました!m(_ _)m

みなさん案をたくさんいただき、ありがとうございます★
ちなみに今回の場合は、Mutexを使うのは不可なのでしょうか?
いまいち、Mutexの使い方が理解できていません。。。
引用返信 編集キー/
■25443 / inTopicNo.7)  Re[2]: VS2005 VB.NET 二重起動防止について
□投稿者/ ラン (3回)-(2008/09/19(Fri) 13:41:58)
No25437 (よねKEN さん) に返信
> 1つのEXEの親画面と子画面の話なんですよね?親画面が子画面の状態を管理して、
> 子画面を開くときにはまず既に子画面の有無をチェックして、あれば閉じる処理を行えばよいと思います。
引用返信 編集キー/
■25446 / inTopicNo.8)  Re[3]: VS2005 VB.NET 二重起動防止について
□投稿者/ たくボン (28回)-(2008/09/19(Fri) 13:54:49)
> ■No25439 (たくボン さん) に返信
> ちなみに今回の場合は、Mutexを使うのは不可なのでしょうか?
> いまいち、Mutexの使い方が理解できていません。。。

そもそもMutexとは、ある特定のリソースに対して、同時にアクセスする危険がある場合など、クリティカルセクションを設けてリソースへのアクセスを制御する機能だと思います。
WindowsなどのマルチタスクOSだと、複数のプロセスが(あたかも)同時に実行されている(ように見える)ので、リソースに対する所有権を確保する目的などで使用されます。
C#ではlockステートメント、VB.NETならSyncLockでも同様の制御が行えます。
引用返信 編集キー/
■25448 / inTopicNo.9)  Re[4]: VS2005 VB.NET 二重起動防止について
□投稿者/ 渋木宏明(ひどり) (883回)-(2008/09/19(Fri) 14:13:47)
渋木宏明(ひどり) さんの Web サイト
補足。

> そもそもMutexとは、ある特定のリソースに対して、同時にアクセスする危険がある場合など、クリティカルセクションを設けてリソースへのアクセスを制御する機能だと思います。
> WindowsなどのマルチタスクOSだと、複数のプロセスが(あたかも)同時に実行されている(ように見える)ので、リソースに対する所有権を確保する目的などで使用されます。
> C#ではlockステートメント、VB.NETならSyncLockでも同様の制御が行えます。

Mutex はプロセス間の排他処理に利用できますが、lock ステートメントによる排他はプロセス内でのみ有効です。

引用返信 編集キー/
■25541 / inTopicNo.10)  Re[5]: VS2005 VB.NET 二重起動防止について
□投稿者/ ラン (4回)-(2008/09/22(Mon) 09:59:47)
返信が遅くなり申し訳ありません。
大変勉強になりました。
皆様ありがとうございました!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -