18. [pywin32] WaitForMultipleObjects 함수

pywin32/win32event|2020. 9. 22. 00:19

int = WaitForMultipleObjects(handleList, bWaitAll , milliseconds )

 

WaitForSingleObjects가 하나의 이벤트 핸들에 대해서 대기를 한다면, 이 함수는 여러개의 이벤트 핸들에 대해서 대기를 할 수 있습니다.

 

인자로는 handleList : [PyHANDLE, ...], bWaitAll : bool, milliseconds : int 가 있습니다.

 

handleList는 PyHANDLES을 담은 리스트 입니다.

 

bWaitAll은 handleList의 모든 이벤트들이 셋트될 때까지 기다릴지 말지를 결정합니다.

 - win32con.TRUE: handleList의 모든 이벤트가 셋트될 때까지 기다립니다.

 - win32con.FALSE: handleList의 이벤트 중 하나만 셋트되면 대기를 해제합니다.

 

milliseconds: 몇 초를 대기할 지 정하는 시간입니다.

 

 

import win32event
import win32con
import win32api

evtHandle1 = win32event.CreateEvent(None, win32con.FALSE, win32con.FALSE, "evtTest1")
evtHandle2 = win32event.CreateEvent(None, win32con.FALSE, win32con.FALSE, "evtTest2")
evtHandle3 = win32event.CreateEvent(None, win32con.FALSE, win32con.FALSE, "evtTest3")

hList = [evtHandle1, evtHandle2, evtHandle3]

while True:
    x = win32event.WaitForMultipleObjects(hList, win32con.FALSE, 3000)
    if x == win32event.WAIT_OBJECT_0:
        print(f"signaled #1")
    elif x == win32event.WAIT_OBJECT_0 + 1:
        print(f"signaled #2")
    elif x == win32event.WAIT_OBJECT_0 + 2:
        print(f"signaled #3")

    elif x== win32event.WAIT_TIMEOUT:
        print(f"time out")
        break
        

win32api.CloseHandle(hList[0])
win32api.CloseHandle(hList[1])
win32api.CloseHandle(hList[2])

WaitForSingleObject 함수 처럼 위의 코드를 따로 실행시키고, 아래의 코드를 따로 실행 시켜야 합니다.

 

import win32event
import win32con
import win32api

evtHandle1 = win32event.OpenEvent(win32event.EVENT_ALL_ACCESS, win32con.FALSE, "evtTest1")
evtHandle2 = win32event.OpenEvent(win32event.EVENT_ALL_ACCESS, win32con.FALSE, "evtTest2")
evtHandle3 = win32event.OpenEvent(win32event.EVENT_ALL_ACCESS, win32con.FALSE, "evtTest3")

hList = [evtHandle1, evtHandle2, evtHandle3]

win32event.SetEvent(evtHandle1)
win32event.SetEvent(evtHandle2)
win32event.SetEvent(evtHandle3)

win32api.CloseHandle(hList[0])
win32api.CloseHandle(hList[1])
win32api.CloseHandle(hList[2])

1번 코드의 WaitForMultipleObjects 함수의 파라미터가 win32con.FLASE이기 때문에 siganled#1, #2, #3이 모두 나타납니다. 만약 win32con.TRUE 였다면, 결과는 signaled#1 하나만 나타나게 됩니다.

 

win32con.FALSE 인 경우

win32con.TRUE 인 경우

 

 

반응형

댓글()