请注意,当使用 时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
线程会收到通知说互斥锁现在已打开。