- PR -

Mutex での画面排他処理

1
投稿者投稿内容
まるーぶら
会議室デビュー日: 2006/02/02
投稿数: 12
投稿日時: 2006-08-14 01:36
VB2005 で画面作成をしております。

同じプロジェクト内で FormA と FormB の2画面が存在し、このプロジェクトは
親画面(FormA)から子画面(FormB)を

 FormB.ShowDialog

で単純にモーダル表示させるだけの機能です。
FormA 、FormB 両画面は継承元クラス BaseForm より派生しており、
BaseForm(これは System.Windows.Forms.Form を継承)のコンストラクタで
Mutex を使用して、画面の多重起動を阻止するプロシージャを呼んでいます。
下記がそのコードです;

Public Class BaseForm
Inherits System.Windows.Forms.Form

Private m_objMutex As Mutex

Public Sub New
MyBase.New
Call PreventDoubleLoading()
End Sub

Private Sub PreventDoubleLoading()

Dim blnMutualExclusion As Boolean

Try
objMutex = New Mutex(True, Application.ProductName, _
blnMutualExclusion)
If blnMutualExclusion = False Then
MessageBox.Show("同じ画面が既に起動しています。")
objMutex.ReleaseMutex()
objMutex.Close()
Else
GC.KeepAlive(objMutex)
End If
Finally
End Try

End Sub

End Class

ここで質問なのですが、上記のように、Mutex でのインスタンス生成時、
引数の二番目に「Application.ProductName」を指定すると、もちろん、
同一のプロジェクト内に存在する FormA と FormB なので、
二重起動のエラーメッセージを表示してしまいます。多重起動を阻止したいのは
あくまで同一画面(FormA)が二つ以上起動しようとした場合のみにエラーに
したいのですが、この引数二番目に、同一プロジェクト内の画面でも画面別で
固有な名称(画面IDなど)を取得できる方法を御存知の方が見えましたら、
ご教授願います。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-08-14 03:36
派生クラスから特定の文字列を渡す、またはリフレクションでインスタンスのクラス名を取得して、それを使うという方法が考えられますね。
_________________
囚人のジレンマな日々
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-08-14 08:37
Mutex使ってるということは、複数プロセス間で排他表示したいんでしょうか?
同じ画面を複数開かないといっても、その動作で本当に問題ないですか?

あと、示されたコードではいつm_objMutexに設定しているのかなどわかりませんが、
目的がよくわからないところでGC.KeepAliveをしてみたり、そもそもコンストラクタで
排他するといつMutexを開放するんだとか、微妙にいろいろ気になったりもしますが…

っていうか見てるとobjMutexはm_objMutexのまちがいですかね…
だったらなおさら(そうでなくても結局同じではありますが)GC.KeepAliveの
意味が分からない…

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-08-14 10:45
そもそも、Mutex を使う必要があるように思えないのですが...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-08-14 10:49
>なちゃさん、じゃんぬねっとさん

そう言えばそうですね。アプリケーション自体の多重起動も防ぎたいのかな?
そうだとしても、フォームに Mutex を持たせる必要が無いし、画面の多重オープンは静的変数等で十分機能しますね。
_________________
囚人のジレンマな日々
1

スキルアップ/キャリアアップ(JOB@IT)