- - PR -
Mutex での画面排他処理
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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など)を取得できる方法を御存知の方が見えましたら、 ご教授願います。 |
|
投稿日時: 2006-08-14 03:36
派生クラスから特定の文字列を渡す、またはリフレクションでインスタンスのクラス名を取得して、それを使うという方法が考えられますね。
_________________ 囚人のジレンマな日々 |
|
投稿日時: 2006-08-14 08:37
Mutex使ってるということは、複数プロセス間で排他表示したいんでしょうか?
同じ画面を複数開かないといっても、その動作で本当に問題ないですか? あと、示されたコードではいつm_objMutexに設定しているのかなどわかりませんが、 目的がよくわからないところでGC.KeepAliveをしてみたり、そもそもコンストラクタで 排他するといつMutexを開放するんだとか、微妙にいろいろ気になったりもしますが… っていうか見てるとobjMutexはm_objMutexのまちがいですかね… だったらなおさら(そうでなくても結局同じではありますが)GC.KeepAliveの 意味が分からない… |
|
投稿日時: 2006-08-14 10:45
そもそも、Mutex を使う必要があるように思えないのですが...
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |
|
投稿日時: 2006-08-14 10:49
>なちゃさん、じゃんぬねっとさん
そう言えばそうですね。アプリケーション自体の多重起動も防ぎたいのかな? そうだとしても、フォームに Mutex を持たせる必要が無いし、画面の多重オープンは静的変数等で十分機能しますね。 _________________ 囚人のジレンマな日々 |
1