2

私はwin32eventPythonモジュールを使用して、別のプログラム(C#ベース)で作成されたMutexと対話しています。

私のコードはミューテックスを開き、それを待ちます:

hWait = win32event.OpenMutex(win32con.MUTEX_ALL_ACCESS, False, "mutexname")
win32event.WaitForSingleObject(hWait, 20000)

このコードの問題は、ミューテックスがまだ作成されていない場合(たとえば、PythonプログラムがC#プログラムがミューテックスを作成する前にミューテックスを開こうとした場合)に失敗することです。

ミューテックスが作成されるまでブロックするにはどうすればよいですか?これを可能にするPythonまたはライブラリメソッドはありますか?

4

2 に答える 2

0

@manuell (コメント) によっても指摘されているように、簡単な解決策は、ミューテックスがまだ存在しないときに発生するエラーを静かにキャッチして、ミューテックスが作成されるまでループすることです。

while True:

   try:
      hWait = win32event.OpenMutex(MUTEX_ALL_ACCESS, False, "mutexname")
   except pywintypes.error:
      pass
   else:
      break

ケースの詳細に応じて、たとえば、ループ内で明示的に少しスリープしたり、待機ループを別のスレッドに配置したり、ジェネレーターまたはコルーチンに変換したり、それを使用して win32 イベントをトリガーして実行したりすることができます。すでに実行中の別のスレッドに何かがあります(イベントが発生するまで待機する方法については、他の回答を参照してください)。

于 2016-10-27T09:26:06.843 に答える
0

を使用する場合win32event.WaitForSingleObject、任意ではあるが待機するのに十分な時間 (20000) を指定するのではなく、次のwin32event.INFINITEようにイベントが発生するまで無期限にブロックするために単純に使用することもできることに注意してください。

win32event.WaitForSingleObject(waitable, win32event.INFINITE)

これは、たとえば、ミューテックスが開いたことを別のスレッドのコードに伝える必要がある場合に役立ちます。

ミューテックスがまだ作成されていない場合、ミューテックスの待機は失敗するため、代わりに、ミューテックスが開かれたときにトリガーするイベントを作成します。

mutex_open = win32event.CreateEvent(None, 0, 0, None)

次に、イベントを待機するスレッドを開始します。

def wait_for_opening(open_evt):
   win32event.WaitForSingleObject(open_evt, win32event.INFINITE)
   print("Got notified that mutex is now open.")

waiter = threading.Thread(target=wait_for_opening, args=(mutex_open,))
waiter.start()

他のプログラムをシミュレートするには、しばらくしてからミューテックスを作成する別のスレッドを開始します。

def delayed_create():
   time.sleep(1)
   m = CreateMutex(None, True, u"mutexname")

creator = threading.Thread(target=delayed_create)
creator.start()

最後に、ミューテックスが開くまで待機し、その後にイベントを設定するループを実行します。

while True:

   try:
      hWait = win32event.OpenMutex(MUTEX_ALL_ACCESS, False, "mutexname")
   except pywintypes.error:
      pass
   else:
      win32event.SetEvent(mutex_open)
      break

setEvent呼び出しに注意してください。

そのため、コードを実行すると、しばらくするwaiterと、ミューテックスが開いていることがスレッドに通知されます。

于 2016-10-27T08:09:15.577 に答える