忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

プログラムの多重起動の抑止(Mutexを使った方法)

プログラムの多重起動を抑止する方法(自分自身が1回しか起動されないようにする方法)について説明します。 抑止する方法はいろいろあるのですが Mutex を使った方法が比較的簡単だと思いますので、今回はその方法について記します。

先ずは Mutex についてですが、これは排他制御を行う為の仕組みで、現在それを「使用中」か「未使用」かを示すフラグの様なものです。 あるプロセス(実行プログラム)が、ある Mutex を取得しそのフラグを「使用中」にします。 再度そのプロセスを実行した場合にその Mutex は既にフラグが「使用中」であれば、起動を中止する様にします。 (簡単な「セマフォ」であるとも言えます)

.NET には Mutex クラスがありますのでそれを使うことになります。

Mutex クラスについて

<コンストラクタ>
System.Threading.Mutex(initiallyOwned As Boolean, name As String, ByRef createdNew As Boolean)

・initiallyOwned:名前付きシステム ミューテックスの初期所有権を付与する場合は true。
                 それ以外の場合は false。
・name          :Mutex の名前です。
・createdNew    :指定した名前付きシステム ミューテックスが作成された場合はブール値 true が格納されます。
                 指定した名前付きシステム ミューテックスが既に存在する場合は false が格納されます。


Mutexを使ったプログラムは以下の様になります。 上記の Mutex クラスを生成した結果 createdNew フラグを確認することで Mutex が生成されたかが分かります。 true でなければ実際の処理は行わない様にして処理を抜ける様にします。

Mutexを使ったプログラムの多重起動の抑止

Module MdlMain

    'Main関数
    Sub Main()

        'ミューテックス名(一意な名前にすること)
        Dim mstrMutexName As String = "TestProgramName" '(仮の名前)
        'ミューテックス
        Dim mMutex As System.Threading.Mutex = Nothing
        '新規作成フラグ
        Dim blnCreated As Boolean = False
        Try
            Try
                '名前付きシステム ミューテックスの初期所有権を付与
                mMutex = New System.Threading.Mutex(True, mstrMutexName, blnCreated)
            Catch ex As Exception
                MessageBox.Show("多重起動はできません。Mutex Error[" & ex.Message & "]")
                Return
            End Try

            'ミューテックスが作成されたか調べる
            If blnCreated = False Then
                MessageBox.Show("多重起動はできません。")
                Return
            End If

            '既設のMainメソッドの処理を実行(表示させたいフォームを表示)
            Dim frm As New frmTest
            Application.Run(frm)

        Finally
            If blnCreated Then
                'ミューテックスを解放する
                mMutex.ReleaseMutex()
            End If
            mMutex.Close()
        End Try

    End Sub

End Module


プログラム中の frmTest は通常のフォームを作成しただけで、フォームの動きは特にプログラミングしていません。
実行の様子を下図に示します。作成された実行ファイルを起動し、その後同じものを起動した時の様子です。


尚、今回の例では Sub Main() メソッドを開始指定(エントリポイント指定)をしてやるのですが、 「プロジェクト・プロパティ」の中の「アプリケーション」タブにある「スタートアップフォーム」でエントリポイントを指定するのですが、 このままでは Sub Main() が中に表示されません。
そこで「アプリケーションフレームワークを有効にする」チェックボックスを無効にすると 「スタートアップフォーム」は「スタートアップオブジェクト」の表示となり、 Sub Main() が出てきますので、それを指定します。














PR

コメント

コメントを書く