を使用する場合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
と、ミューテックスが開いていることがスレッドに通知されます。