2017-03-28 4 views
2

ミューテックスを使用してアプリケーションを一度に1つのインスタンスだけを実行するように制限する方法を理解しています。しかし、私のアプリケーションでは、複数のインスタンスを同時に実行することができますが、実行可能ファイルの名前が変更されているかどうかに関係なく、特定のユーザーの実行中のインスタンスをすべてカウントしたりリストする方法が必要です。ここでミューテックスを使用することができますか、これを行うことができるプロセスクラスですか?私は、名前でプロセスをリストするプロセスクラスを使用する方法を知っていますが、EXEがユーザーによって名前が変更された場合はどうなりますか?これはどのようにして最善の扱いですか特定のユーザーログオンで実行されている1つのプロセスのすべてのインスタンスを数える最善の方法は何ですか?

EDIT:私の目的のために、同じアプリケーションの他のインスタンスを数え上げるのではなく、数えられるだけで十分であることが判明しました。それらを数えるために、私は名前付きセマフォーを使用しました。

//.Release() will exit the semaphore and increment the semaphore count, but it will also return the value of the count just before .Release() was called, which is what we really need here. 
int numberOfRunningInstances = 10000 - mySemaphore.Release(); 
//Then we can simply use .WaitOne() to re-enter the semaphore and decrement the count back to what it was before calling .Release() 
mySemaphore.WaitOne(); 

を次にとき:アプリケーションの実行中の各インスタンスは、1で私が使用することができます実行している私は、アプリケーションのどのように多くのインスタンスをチェックする必要があり、その後の任意の時間をカウントがデクリメントされますので

//Initialize the semaphore with an initial value of 10000 and a maximum value of 10000. The 'Global\' prefix will be system wide. Remove it to limit the semaphore to the current logon session 
Semaphore mySemaphore = new Semaphore(10000, 10000, @"Global\mySemaphoreUniqueNameGoesHere"); 
//Call .WaitOne() to enter the semaphore and decrement the semaphore count 
mySemaphore.WaitOne(); 

アプリケーション終了:

//call .Release() to exit the semaphore and increment the count 
mySemaphore.Release() 
+0

明確にするには:1.exe、2.exe、および3.exeを持っていても、同じexeのすべてが同一のコピーである場合のみ、別の名前に変更されています。同じアプリケーションの名前が同じでない場合 –

+1

共有メモリ(Windows用語ではファイルマッピングですが、実際のファイルは必要ありません)を使用して、各プロセスに独自のプロセスIDをリストに追加させることができます。 –

答えて

1

これは正確な複製ではありませんが、この既存の質問には、listing all processes for all usersに非常に近いです。

管理オブジェクトから、あなたはこのようなGetOwnerメソッドを呼び出すことができます。

string[] o = new String[2]; 
queryObj.InvokeMethod("GetOwner", (object[])o); 

はEDIT:あなたが達成するために、あなたが扱うことができる複雑さの種類/必要性を望むものに依存
いくつかの可能な解決策を、。

1-実行中のバイナリのパスを取得し、実行可能ファイルのチェックサムを計算し、それを他のものと比較することができます。これはあなたが探している解決策ではないかもしれません。

2これらのアプリケーションのソースを制御する場合は、起動時にシステム全体を登録することができます。グローバルsemaphoresを登録し、現在のカウントを取得することは可能であるようです。

3すべてのインスタンス間で何らかの種類の共有メモリを実装します(例:memory mapped files)。それらの間に興味深い情報をすべて共有します。これは、プロセスが終了したときにメモリを適切にクリーンアップしたり、おそらくロックしたりするような、より複雑な問題を引き起こします。

によって、ある種のシステムワイドイベントブロードキャスタ/レシーバを実装できます。プロセスが開始すると、pidがハードコーディングされたフォルダ内の新しいファイルに書き込まれます。あなたのプロセスに新しいスタートアップが通知されると、フォルダ内のすべてのファイルが読み込まれ、pidが取得されます。

+0

これは私の質問の第一の目的が欠けていると思います。問題は、プロセスの所有者を取得する方法ではありません。問題は、.exeの名前が変更されても同じ実行可能なプロセスを取得する方法です。だから、もし私が1.exe、2.exe、3.exeを持っていて、まったく同じ.exeという名前のすべてのコピーですが、名前を変更したらどうすればこれらのリストを取得できますか? –

+0

それを忘れて申し訳ありません。どのケースをカバーしたいのか説明できますか?実行可能ファイルは、通常は使用中に修正のためにロックされます。どのように名前を変更できますか?コピーと同様? – Eric

+0

これらは使用中に名前が変更されません。私はちょうど1つのexeファイルが複数回コピーされ、各コピーが異なる名前を持つ状況について話しています。その後、コピーされた/名前が変更された後に起動されます。ありがとう。 –

関連する問題