20. [pywin32] WaitForMultipleObjectsEx 함수

pywin32/win32event|2020. 9. 24. 00:26

int = WaitForMultipleObjectsEx(handleList, bWaitAll , milliseconds , bAlertable )

 

기본적인 기능은 WaitForMultipleObjects와 같습니다.

 

[pywin32/win32event] - 18. [pywin32] WaitForMultipleObjects 함수

추가적으로 bAlertable 인자가 있습니다. win32con.TRUE 일 때 경계 대기 상태가 된다고 하는데 이는 비동기 IO 작업 시 작업이 완료 되면 신호를 받도록 하는 인자입니다. 그런데 pywin32 에서는 잘 되지 않는 것 같습니다...

반응형

댓글()

19. [pywin32] WaitForSingleObjectEx 함수

pywin32/win32event|2020. 9. 23. 00:25

int = WaitForSingleObjectEx(hHandle, milliseconds , bAlertable )

 

기본적인 기능은 WaitForSingleObject와 같습니다.

 

[pywin32/win32event] - 3. [pywin32] WaitForSingleObject 함수

 

3. [pywin32] WaitForSingleObject 함수

int = WaitForSingleObject(hHandle, milliseconds ) 이벤트 하나를 등록시켜놓고 이벤트가 셋트 되면 이를 알려주는 함수입니다. 인자로는 hHandle : PyHANDLE, milliseconds : int 가 있습니다. hHandle: 대기상..

ssjune.tistory.com

 

추가적으로 bAlertable 인자가 있습니다. win32con.TRUE 일 때 경계 대기 상태가 된다고 하는데 이는 비동기 IO 작업 시 작업이 완료 되면 신호를 받도록 하는 인자입니다. 그런데 pywin32 에서는 잘 되지 않는 것 같습니다....

 

 

 

 

반응형

댓글()

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 인 경우

 

 

반응형

댓글()

17. [pywin32] ReleaseSemaphore 함수

pywin32/win32event|2020. 9. 21. 00:08

int = ReleaseSemaphore(hEvent, lReleaseCount )

 

WaitForSingleObject로 점유한 세마포어의 점유를 해제하는 함수입니다.

 

인자로는 hEvent : PyHANDLE, lReleaseCount : int 가 있습니다.

 

hEvent는 세마포어의 핸들 값입니다.

 

lReleaseCount는 세마포어 점유 해제 시 카운트를 몇을 증가시킬 지 정합니다. 기본적으로 1로 설정하는 듯 합니다.

 - WaitForSingleObject로 세마포어를 점유 시 세마포어의 카운트가 1씩 감소합니다. 현재 예제에서는 최대 카운트가 2, 초기 카운트가 1이였으니 WaitForSingleObject을 한번 호출하면 세마포어의 카운트가 0이 되면서 다른 쓰레드가 접근을 하지 못하게 됩니다.

 

return 값은 세마포어를 점유 해제하기 전 세마포어의 카운트 값입니다.

 

 

import threading
import win32event
import win32con
import win32api

total=0
sHandle=0

def sum(num):
    global total
    global sHandle
  
    win32event.WaitForSingleObject(sHandle, win32event.INFINITE)

    for i in range(100000):
        total+=1

    pCnt = win32event.ReleaseSemaphore(sHandle, 1)
    
    print(f"Subthread {num} : {total}\n")

x = win32event.CreateSemaphore(None, 1, 2, "semaTest")

sHandle=win32event.OpenSemaphore(win32event.EVENT_ALL_ACCESS, win32con.FALSE, "semaTest")

t = threading.Thread(target=sum, args=(1,))
t2 =  threading.Thread(target=sum, args=(2,))
t.start()
t2.start()

print("Main Thread\n")

win32api.CloseHandle(sHandle)
win32api.CloseHandle(x)

위의 예제는 Mutex 예제와 동일하게 동작합니다. 하지만, x = win32event.CreateSemaphore(None, 1, 2, "semaTest") 이 부분을 x = win32event.CreateSemaphore(None, 2, 2, "semaTest")로 바꿔서 실행시켜 보시면, 쓰레드 2개가 동시에 total 변수에 접근이 가능해져서 계산 결과가 이상하게 나오게 됩니다.

 

x = win32event.CreateSemaphore(None, 1, 2, "semaTest")인 경우

x = win32event.CreateSemaphore(None, 2, 2, "semaTest")인 경우

 

 

반응형

댓글()

16. [pywin32] OpenSemaphore 함수

pywin32/win32event|2020. 9. 20. 00:53

PyHANDLE = OpenSemaphore(desiredAccess, bInheritHandle , name )

 

만들어진 세마포어를 오픈하는 함수입니다.

 

인자로는 desiredAccess : int, bInheritHandle : bool, name : PyUnicode 가 있습니다.

 

desiredAccess는 세마포어에 대한 접근권한입니다.

 - win32event.EVENT_ALL_ACCESS: 객체에 대한 모든 권한을 부여합니다.(세마포어는 이 권한을 사용해야 합니다.)

 

bInheritHandle은 TRUE/FALSE 둘 중 하나를 가집니다.

 - win32con.TRUE: 호출하는 프로그램의 핸들을 상속합니다.

 - win32con.FALSE: 호출하는 프로그램의 핸들을 상속하지 않습니다.

 

name은 CreateSemaphore 함수 사용 시 사용했던 세마포어의 이름입니다.

 

Return 값은 오픈한 세마포어의 핸들값입니다.

 

 

import win32event
import win32con
import win32api

x = win32event.CreateSemaphore(None, 1, 2, "semaTest")

sHandle=win32event.OpenSemaphore(win32event.EVENT_ALL_ACCESS, win32con.FALSE, "semaTest")

print("Main Thread\n")

win32api.CloseHandle(sHandle)
win32api.CloseHandle(x)

위의 예제는 OpenSemaphore의 사용을 보여주기 위해 적었으나, 사실 CreateSemaphore로 만들어서 그대로 사용해도 되고, OpenSemaphore는 다른 프로세스에서 호출하는 식으로 사용합니다.

 

 

반응형

댓글()

15. [pywin32] CreateSemaphore 함수

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

PyHANDLE = CreateSemaphore(SemaphoreAttributes, InitialCount , MaximumCount , SemaphoreName )

 

인자로는 SemaphoreAttributes : PySECURITY_ATTRIBUTES, InitialCount : int, MaximumCount : int, SemaphoreName : str가 있습니다.

 

SemaphoreAttributes는 세마포어에 대한 보안 속성으로 None으로 두셔도 무방합니다.

 

InitialCount는 세마포어의 초기 카운트 값으로 0이상 MaximumCount 값 이하여야 합니다.

 

MaxiumCount는 세마포어의 최대 카운트 값으로 최대 몇개의 쓰레드가 세마포어에 접근할 수 있는지를 나타냅니다.

 

SemaphoreName은 문자열 값이며, 뮤텍스의 이름을 지정해줍니다.

 

return 값은 세마포어의 핸들 값입니다.

 

 

import win32event
import win32con
import win32api

x = win32event.CreateSemaphore(None, 1, 2, "semaTest")

print("Main Thread\n")

win32api.CloseHandle(x)

 

semaTest라는 이름의 세마포어를 생성했습니다.

최대 카운트가 2이므로, 최대 2개의 쓰레드의 동시 접근을 허용하나, 초기 카운트 값이 1이므로 일단은 1개의 쓰레드만이 세마포어에 접근할 수 있습니다.

 

 

반응형

'pywin32 > win32event' 카테고리의 다른 글

17. [pywin32] ReleaseSemaphore 함수  (0) 2020.09.21
16. [pywin32] OpenSemaphore 함수  (0) 2020.09.20
14. [pywin32] ReleaseMutex 함수  (0) 2020.09.18
13. [pywin32] OpenMutex 함수  (0) 2020.09.17
12. [pywin32] CreateMutex 함수  (0) 2020.09.16

댓글()

14. [pywin32] ReleaseMutex 함수

pywin32/win32event|2020. 9. 18. 00:46

ReleaseMutex(hEvent)

 

CreateMutex나 OpenMutex로 만든 뮤텍스의 점유를 해제하는 함수입니다.

 

인자로는 hEvent : PyHANDLE 가 있습니다.

 

hEvent는 뮤텍스의 핸들값입니다.

 

 

import threading
import win32event
import win32con
import win32api

total=0
mHandle=0


def sum(num):
    global total
    global mHandle

    
    win32event.WaitForSingleObject(mHandle, win32event.INFINITE)
    # 여기와

    for i in range(100000):    
        total+=1

    win32event.ReleaseMutex(mHandle)
    # 여기를 지우고 실행시키면 결과가 달라집니다.
    
    print(f"Subthread {num} : {total}\n")

x = win32event.CreateMutex(None, win32con.FALSE, "mutexTest")
# win32event.ReleaseMutex(x)

mHandle=win32event.OpenMutex(win32event.SYNCHRONIZE, win32con.FALSE, "mutexTest")

t = threading.Thread(target=sum, args=(1,))
t2 =  threading.Thread(target=sum, args=(2,))
t.start()
t2.start()

print("Main Thread\n")

win32api.CloseHandle(mHandle)
win32api.CloseHandle(x)

갑자기 코드가 늘어났습니다.ㅎㅎ

먼저 threading 모듈은 파이썬에서 쓰레드를 생성시켜주는 모듈입니다. 뮤텍스의 사용에 대한 설명을 하기 위해서는 쓰레드가 필요해서 넣었습니다.

 

간단히 설명하자면, 두개의 쓰레드가 total이라는 하나의 변수에 값을 1씩 계속 더하는 코드입니다. 문제는 두개의 쓰레드가 total 변수에 동시에 접근할 떄 값이 제대로 더해지지 않는 경우가 생긴다는 겁니다. 이런 경우를 위해서 뮤텍스를 이용해 쓰레드의 동시 접근을 막고 하나만 접근할 수 있게 합니다.

 

위의 결과가 뮤텍스를 이용했기 때문에 제대로 total이 증가한 상황입니다.

 

만약 코드에서 표시한 부분(뮤텍스 부분)을 주석처리한 후 실행한다면 위처럼 total이 제대로 증가하지 않을 것입니다.

 

 

반응형

'pywin32 > win32event' 카테고리의 다른 글

16. [pywin32] OpenSemaphore 함수  (0) 2020.09.20
15. [pywin32] CreateSemaphore 함수  (0) 2020.09.19
13. [pywin32] OpenMutex 함수  (0) 2020.09.17
12. [pywin32] CreateMutex 함수  (0) 2020.09.16
11. [pywin32] SetWaitableTimer 함수  (0) 2020.09.12

댓글()

13. [pywin32] OpenMutex 함수

pywin32/win32event|2020. 9. 17. 00:33

PyHANDLE = OpenMutex(desiredAccess, bInheritHandle , name )

 

인자로는 desiredAccess : int, bInheritHandle : bool, name : PyUnicode 가 있습니다.

 

desiredAccess는 뮤텍스에 대한 접근권한을 나타냅니다.

- win32event.SYNCHRONIZE: (NT만 가능) 동기화를 위해 사용합니다. 뮤텍스는 이 권한만 있으면 되는 것 같습니다.

 

bInheritHandle은 TRUE/FALSE 둘 중 하나를 가집니다.

 - win32con.TRUE: OpenEvent는 호출하는 프로그램의 핸들을 상속합니다.

 - win32con.FALSE: OpenEvent는 호출하는 프로그램의 핸들을 상속하지 않습니다.

 

name은 CreateMutex 함수 사용 시 사용했던 뮤텍스의 이름입니다.

 

Return 값은 오픈한 뮤텍스의 핸들값입니다.

 

 

import win32event
import win32con
import win32api

x = win32event.CreateMutex(None, win32con.FALSE, "mutexTest")
# win32event.ReleaseMutex(x)
# CreateMutex에 win32con.TRUE 라면 위의 함수로 점유를 해제해 줘야 합니다.

mHandle=win32event.OpenMutex(win32event.SYNCHRONIZE, win32con.FALSE, "mutexTest")

print("Main Thread\n")

win32api.CloseHandle(mHandle)
win32api.CloseHandle(x)

위의 예제는 OpenMutex의 사용을 보여주기 위해 적었으나, 사실 CreateMutex로 만들어서 그대로 사용해도 되고, OpenMutex는 다른 프로세스에서 호출하는 식으로 사용합니다.

 

 

반응형

댓글()

12. [pywin32] CreateMutex 함수

pywin32/win32event|2020. 9. 16. 00:15

PyHANDLE = CreateMutex(MutexAttributes, InitialOwner , Name )

 

인자로는 MutexAttributes : PySECURITY_ATTRIBUTES, InitialOwner : bool, Name : PyUnicode 가 있습니다.

 

MutexAttributes는 뮤텍스에 대한 보안 속성으로 None으로 두셔도 무방합니다.

 

InitialOwner는 초기 뮤텍스를 점유할 것이냐를 정하는 값입니다.

 - win32con.TRUE: 생성한 후 뮤텍스를 점유합니다. 다른 쓰레드에서 뮤텍스를 사용하려면 ReleaseMutex 함수로 점유를 해제해야합니다.

 - win32con.FALSE: 뮤텍스를 생성하기만 합니다.

 

Name: 문자열 값이며, 뮤텍스의 이름을 지정해줍니다.

 

 

import win32event
import win32con
import win32api

x = win32event.CreateMutex(None, win32con.FALSE, "mutexTest")
# win32event.ReleaseMutex(x)
# CreateMutex에 win32con.TRUE 라면 위의 함수로 점유를 해제해 줘야 합니다.

print("Main Thread\n")

win32api.CloseHandle(x)

 

mutexTest라는 이름의 뮤텍스를 생성했습니다.

 

 

반응형

댓글()

11. [pywin32] SetWaitableTimer 함수

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

SetWaitableTimer(handle, dueTime, period, func, param, resume_state)

 

대기 타이머를 셋트 시키는 함수입니다.

 

인자로는 handle : PyHANDLE, dueTime : long, period : int, func : object, param : object, resume_state : bool 가 있습니다.

 

handle은 셋트할 타이머의 핸들 값으로 OpenWaitableTimer의 반환값을 사용하겠습니다.

 

dueTime은 타이머의 시작 시간으로 그냥 숫자 입력 시 절대 시간, 마이너스 입력 시 상대 시간을 나타냅니다. 단위는 ns(나노세컨드)단위입니다.

 - 절대 시간의 경우, 아직 제가 사용법을 잘 모르겠네요....

 

period는 타이머의 주기로 ms(밀리세컨드)단위입니다.(0일 경우 한번만 실행됩니다.)

 

func는 None으로 하셔야 합니다.

 

param은 None으로 하셔야 합니다.

 

resume_state은 TRUE일 경우, 타이머가 셋트 될 때 절전모드에서 복구된다고 하는데 잘 모르겠습니다... 저는 FLASE로 두고 사용하겠습니다.

 

import win32event
import win32con
import win32api

evtHandle = win32event.OpenWaitableTimer(win32event.EVENT_ALL_ACCESS, win32con.FALSE, "timerTest")

dt = -30000000
win32event.SetWaitableTimer(evtHandle, dt, 1000, None, None, win32con.FALSE)

win32api.CloseHandle(evtHandle)

위의 예제는 CancelWaitableTimer 함수의 예제를 실행시킨 후 파이썬을 하나 더 실행시켜서 해보셔야 합니다.

 

[pywin32/win32event] - 10. [pywin32] CancelWaitableTimer 함수

실행 결과, 타이머가 3초 후 5번 실행되고 종료됩니다.

 

 

 

 

 

반응형

댓글()

10. [pywin32] CancelWaitableTimer 함수

pywin32/win32event|2020. 9. 11. 00:26

CancelWaitableTimer(handle)

 

동작하는 타이머를 종료하는 함수입니다.

 

인자로는 handle이 있습니다.

 

handle은 종료시킬 타이머의 핸들값입니다.

 

import win32event
import win32con
import win32api

evtHandle = win32event.CreateWaitableTimer(None, win32con.FALSE, "timerTest")

cnt=0
while True:
    x = win32event.WaitForSingleObject(evtHandle, win32event.INFINITE)
    if x == win32event.WAIT_OBJECT_0:
        print(f"signaled #1")
        cnt+=1   
    elif x == win32event.WAIT_TIMEOUT:
        print(f"time out")
        break
    if cnt==5:
        win32event.CancelWaitableTimer(evtHandle)
        break

win32api.CloseHandle(evtHandle)

지금은 실행시켜도 아무차이도 못 느끼실겁니다.

 

이건 다음에 설명할 SetWaitableTimer에서 사용하겠습니다.ㅎㅎ

 

 

반응형

'pywin32 > win32event' 카테고리의 다른 글

12. [pywin32] CreateMutex 함수  (0) 2020.09.16
11. [pywin32] SetWaitableTimer 함수  (0) 2020.09.12
9. [pywin32] OpenWaitableTimer 함수  (0) 2020.09.10
8. [pywin32] CreateWaitableTimer 함수  (0) 2020.09.09
7. [pywin32] PulseEvent 함수  (0) 2020.08.31

댓글()

9. [pywin32] OpenWaitableTimer 함수

pywin32/win32event|2020. 9. 10. 00:56

PyHANDLE = OpenWaitableTimer(desiredAccess, bInheritHandle , timerName )

 

CreateWaitableTimer로 생성된 타이머를 오픈하는 함수입니다.

 

인자로는 desiredAccess : int, bInheritHandle : bool, timerName : str가 있습니다.

 

desiredAccess는 접근 권한을 나타냅니다.

 - win32event.EVENT_ALL_ACCESS: 객체에 대한 모든 권한을 부여합니다.

 - win32event.EVENT_MODIFY_STATE: 수정상태로 SetWaitableTimer, CancelWaitableTimer 함수 사용 시 필요합니다.

 - win32event.SYNCHRONIZE: (NT만 가능) 동기화를 위해 사용합니다.

 

bInheritHandle은 TRUE/FALSE 둘 중 하나를 가집니다.

 - win32con.TRUE: 호출하는 프로그램의 핸들을 상속합니다.

 - win32con.FALSE: 호출하는 프로그램의 핸들을 상속하지 않습니다.

 

name은 CreateWaitableTimer 함수 사용 시 사용했던 이벤트의 이름입니다.

 

Return 값은 오픈한 이벤트의 핸들값입니다

 

import win32event
import win32con
import win32api

evtHandle = win32event.OpenWaitableTimer(win32event.EVENT_ALL_ACCESS, win32con.FALSE, "timerTest")

win32api.CloseHandle(evtHandle)

참고로 위의 예제는 CreateWaitableTimer 함수의 예제를 실행시킨 후 파이썬을 하나 더 실행시켜서 해보셔야 합니다.

 

그렇지 않으면 timerTest라는 이름의 타이머를 찾을 수 없다고 나옵니다

 

[pywin32/win32event] - 8. [pywin32] CreateWaitableTimer 함수

 

 

반응형

'pywin32 > win32event' 카테고리의 다른 글

11. [pywin32] SetWaitableTimer 함수  (0) 2020.09.12
10. [pywin32] CancelWaitableTimer 함수  (0) 2020.09.11
8. [pywin32] CreateWaitableTimer 함수  (0) 2020.09.09
7. [pywin32] PulseEvent 함수  (0) 2020.08.31
6. [pywin32] ResetEvent 함수  (0) 2020.08.31

댓글()

8. [pywin32] CreateWaitableTimer 함수

pywin32/win32event|2020. 9. 9. 00:48

PyHANDLE = CreateWaitableTimer(TimerAttributes, ManualReset , TimerName )

 

대기 타이머를 생성하는 함수입니다.

 

인자로는 TimerAttributes : PySECURITY_ATTRIBUTES, ManualReset : bool, TimerName : str 가 있습니다.

 

TimerAttributes는 이벤트에 대한 보안 속성이며, None으로 두어도 무방합니다.

 

ManualReset은 win32con.TRUE/FALSE 2개의 값을 갖을 수 있습니다.

 - win32con.TRUE: 타이머 리셋을 개발자가 수동으로 해주어야 합니다.

 - win32con.FALSE: 타이머 리셋이 자동으로 호출됩니다.

그런데 제가 사용해보니 win32con.TRUE는 사용법을 모르겠더군요... 그래서 저는 어쩔 수 없이 win32con.FLASE로 진행했습니다.

 

Name: 문자열 값이며, 타이머의이름을 지정해줍니다.

 

import win32event
import win32con
import win32api

evtHandle = win32event.CreateWaitableTimer(None, win32con.FALSE, "timerTest")

while True:
    x = win32event.WaitForSingleObject(evtHandle, 5000)
    if x == win32event.WAIT_OBJECT_0:
        print(f"signaled #1")
        
    elif x == win32event.WAIT_TIMEOUT:
        print(f"time out")
        break

win32api.CloseHandle(evtHandle)

timerTest 라는 이름의 타이머가 생성되었습니다.

 

 

반응형

'pywin32 > win32event' 카테고리의 다른 글

10. [pywin32] CancelWaitableTimer 함수  (0) 2020.09.11
9. [pywin32] OpenWaitableTimer 함수  (0) 2020.09.10
7. [pywin32] PulseEvent 함수  (0) 2020.08.31
6. [pywin32] ResetEvent 함수  (0) 2020.08.31
5. [pywin32] SetEvent 함수  (0) 2020.08.31

댓글()

7. [pywin32] PulseEvent 함수

pywin32/win32event|2020. 8. 31. 00:58

PulseEvent(hEvent)

 

이벤트를 셋트로 설정 후 리셋 시키는 함수입니다. SetEvent 함수와 ResetEvent 함수를 순서대로 호출한다고 봐도 무방할 것 같습니다.

 

인자로는 hEvent : PyHANDLE 가 있습니다.

 

hEvent: 셋트 시킬 이벤트의 핸들입니다. 보통 OpenEvent 함수의 리턴값을 사용하게 됩니다.

 

 

반응형

'pywin32 > win32event' 카테고리의 다른 글

9. [pywin32] OpenWaitableTimer 함수  (0) 2020.09.10
8. [pywin32] CreateWaitableTimer 함수  (0) 2020.09.09
6. [pywin32] ResetEvent 함수  (0) 2020.08.31
5. [pywin32] SetEvent 함수  (0) 2020.08.31
4. [pywin32] OpenEvent 함수  (0) 2020.08.31

댓글()

6. [pywin32] ResetEvent 함수

pywin32/win32event|2020. 8. 31. 00:48

ResetEvent(hEvent)

 

이벤트를 리셋 시키는 함수입니다.

 

인자로는 hEvent : PyHANDLE 가 있습니다.

 

hEvent: 리셋시킬 이벤트 핸들입니다. 보통 OpenEvent 함수의 리턴값을 사용합니다.

 

이 함수를 실험하기 전에 WaitForSingleObject 함수의 예제를 아래와 같이 바꾸고 실행시켜 줍니다.

import win32event
import win32con
import win32api

evtHandle = win32event.CreateEvent(None, win32con.TRUE, win32con.TRUE, "eventTest")

while True:
    x = win32event.WaitForSingleObject(evtHandle, 3000)
    if x == win32event.WAIT_OBJECT_0:
        print(f"signaled #1")
    elif x== win32event.WAIT_TIMEOUT:
        print(f"time out")
        break

win32api.CloseHandle(evtHandle)

이벤트 초기 상태를 셋트하고, 자동 리셋을 해제 시켜서 signaled #1이 무한 실행될 것입니다.

 

그리고 아래의 ResetEvent 예제를 실행시켜 봅시다.

import win32event
import win32con
import win32api

evtHandle = win32event.OpenEvent(win32event.EVENT_ALL_ACCESS, win32con.FALSE, "eventTest")

win32event.ResetEvent(evtHandle)

win32api.CloseHandle(evtHandle)

아래와 같이 signaled #1이 무한 발생하다가 이벤트를 리셋시키는 순간 정지됩니다. 그 후 3초(3000ms)가 지나면 타임 아웃이 걸립니다.

 

 

반응형

'pywin32 > win32event' 카테고리의 다른 글

8. [pywin32] CreateWaitableTimer 함수  (0) 2020.09.09
7. [pywin32] PulseEvent 함수  (0) 2020.08.31
5. [pywin32] SetEvent 함수  (0) 2020.08.31
4. [pywin32] OpenEvent 함수  (0) 2020.08.31
3. [pywin32] WaitForSingleObject 함수  (0) 2020.08.31

댓글()

1. [pywin32] win32process 소개

pywin32/win32process|2020. 8. 31. 00:36

윈도우의 프로세스와 쓰레드를 관리하는 api를 다루는 모듈입니다.

 

win32job이 프로세스와 쓰레드를 job으로써 관리하는 모듈이라면 win32process는 프로세스와 쓰레드 그 자체를 다루는 모듈로 보입니다.

 

다음과 같은 46가지 함수를 지원합니다.

 

  • AttachThreadInput - 보류
  • CreateProcess - 8
  • CreateProcessAsUser - 보류
  • CreateRemoteThread - 보류
  • EnumProcessModules - 11
  • EnumProcessModulesEx - 11
  • EnumProcesses - 11
  • ExitProcess - 9
  • GetCurrentProcess - 10
  • GetCurrentProcessId - 10
  • GetExitCodeProcess - 9
  • GetExitCodeThread - 5
  • GetGuiResources - 12
  • GetModuleFileNameEx - 11
  • GetPriorityClass - 13
  • GetProcessAffinityMask - 13
  • GetProcessId - 10
  • GetProcessIoCounters - 12
  • GetProcessMemoryInfo - 12
  • GetProcessPriorityBoost - 13
  • GetProcessShutdownParameters - 13
  • GetProcessTimes - 12
  • GetProcessVersion - 12
  • GetProcessWindowStation - win32service 에서 다룸
  • GetProcessWorkingSetSize - 13
  • GetStartupInfo - 8
  • GetThreadIOPendingFlag - 5
  • GetThreadPriority - 5
  • GetThreadPriorityBoost - 5
  • GetThreadTimes - 5
  • GetWindowThreadProcessId - 5
  • IsWow64Process - 8
  • ResumeThread - 4
  • STARTUPINFO - 8
  • SetPriorityClass - 14
  • SetProcessAffinityMask - 14
  • SetProcessPriorityBoost - 14
  • SetProcessShutdownParameters - 14
  • SetProcessWorkingSetSize - 14
  • SetThreadAffinityMask - 7
  • SetThreadIdealProcessor - 7
  • SetThreadPriority - 6
  • SetThreadPriorityBoost - 6
  • SuspendThread - 3
  • TerminateProcess - 9
  • beginthreadex - 2

 

[pywin32/win32process] - 2. [pywin32] beginthreadex 함수

 

2. [pywin32] beginthreadex 함수

PyHANDLE, int = beginthreadex(sa, stackSize , entryPoint , args , flags ) 쓰레드를 생성하는 함수입니다. 인자로는 sa : PySECURITY_ATTRIBUTES, stackSize : int, entryPoint : function, args : tuple, fla..

ssjune.tistory.com

[pywin32/win32process] - 3. [pywin32] SuspendThread 함수

 

3. [pywin32] SuspendThread 함수

int = SuspendThread(handle) 쓰레드를 정지시키는 함수입니다. 인자로는 handle : PyHANDLE 이 있습니다. handle는 정지시킬 쓰레드 핸들입니다. 리턴 값은 int 로 해당 쓰레드의 이전까지의 정지 카운트입니다

ssjune.tistory.com

[pywin32/win32process] - 4. [pywin32] ResumeThread 함수

 

4. [pywin32] ResumeThread 함수

int = ResumeThread(handle) 정지된 쓰레드를 재개하는 함수입니다. SuspendThread 함수가 Suspend count를 올린다면 ResumeThread 함수로 count를 낮춰서 0이되면 쓰레드가 재개됩니다. 인자로는 handle : PyHAND..

ssjune.tistory.com

[pywin32/win32process] - 5. [pywin32] GetThread... 관련 함수

 

5. [pywin32] GetThread... 관련 함수

이번에 설명할 함수는 다음의 6개 함수에 대해서 설명하려고 합니다. 1. int = GetExitCodeThread(handle) 쓰레드의 종료 코드를 반환하는 함수입니다. 쓰레드 마지막에 return X 라고 쓰면 X값이 종료 코드

ssjune.tistory.com

[pywin32/win32process] - 6. [pywin32] SetThreadPriority & Boost 함수

 

6. [pywin32] SetThreadPriority & Boost 함수

1. SetThreadPriority(handle, nPriority) 쓰레드의 우선순위 레벨을 설정하는 함수입니다. 인자로는 handle : PyHANDLE, nPriority : int가 있습니다. handle은 쓰레드의 핸들값입니다. nPriority는 쓰레드의 설..

ssjune.tistory.com

[pywin32/win32process] - 7. [pywin32] SetThreadAffinityMask & SetThreadIdealProcessor 함수

 

7. [pywin32] SetThreadAffinityMask & SetThreadIdealProcessor 함수

1. int = SetThreadAffinityMask(hThread, ThreadAffinityMask ) 쓰레드의 CPU 선호도를 설정합니다. 선호도란 멀티 프로세서의 경우 어떤 CPU에 작업을 할당할 지를 말합니다. 위의 이미지는 작업관리자 > 프로..

ssjune.tistory.com

[pywin32/win32process] - 8. [pywin32] CreateProcess 및 기타 함수

 

8. [pywin32] CreateProcess 및 기타 함수

1. PySTARTUPINFO = STARTUPINFO() STARTUPINFO 구조체를 생성하는 함수입니다. 프로세스를 만들 때 사용하기 때문에 처음에 호출해주어야 합니다. 다음의 멤버를 갖고 있습니다. integer dwX: 왼쪽 위의 x 좌표,.

ssjune.tistory.com

[pywin32/win32process] - 9. [pywin32] ExitProcess & TerminateProcee 및 관련 함수

 

9. [pywin32] ExitProcess & TerminateProcee 및 관련 함수

1. ExitProcess(exitCode) 현재 프로세스를 종료시키는 함수입니다. 인자로는 exitCode : int가 있습니다. exitCode: 프로세스가 종료될 때 종료 코드를 설정합니다. 2. TerminateProcess(handle, exitCode) 지정..

ssjune.tistory.com

[pywin32/win32process] - 10. [pywin32] GetProcess... 관련 함수 - 1

 

10. [pywin32] GetProcess... 관련 함수 - 1

1. int = GetCurrentProcess() 현재 프로세스의 핸들값을 반환하는 함수입니다. 리턴값은 현재 프로세스의 핸들값입니다. 그런데 보안을 위해서인지 -1을 반환하는 것으로 고정되어 있습니다. 2. int = GetC

ssjune.tistory.com

[pywin32/win32process] - 11. [pywin32] EnumProcess 관련 함수

 

11. [pywin32] EnumProcess 관련 함수

1. (long,....) = EnumProcesses() 현재 동작하는 프로세스를 열거하는 함수입니다. 리턴값은 현재 동작하는 프로세스 아이디 목록입니다. 2. (long,....) = EnumProcessModules(hProcess) 특정 프로세스가 사용하..

ssjune.tistory.com

[pywin32/win32process] - 12. [pywin32] GetProcess... 관련 함수 - 2

 

12. [pywin32] GetProcess... 관련 함수 - 2

1. int = GetGuiResources(Process, Flags ) 프로세스의 GDI 혹은 USER Object 핸들 갯수를 반환하는 함수입니다. GDI Object는 그래픽 출력과 관련있는 Object를 말하는 듯 합니다.(ex. bitmap, brush...)  - MS..

ssjune.tistory.com

[pywin32/win32process] - 13. [pywin32] GetProcess... 관련 함수 - 3

 

13. [pywin32] GetProcess... 관련 함수 - 3

1. int = GetPriorityClass(handle) 프로세스의 우선순위를 클래스를 반환하는 함수입니다. 인자로는 handle : PyHANDLE 가 있습니다. handle: 프로세스의 핸들값입니다. 리턴값은 다음과 같습니다. 값 이름 의미

ssjune.tistory.com

[pywin32/win32process] - 14. [pywin32] SetProcess... 관련 함수

 

14. [pywin32] SetProcess... 관련 함수

1. SetPriorityClass(handle, dwPriorityClass) 프로세스의 우선순위 클래스를 설정하는 함수입니다. 인자로는 handle : PyHANDLE, dwPriorityClass : int 가 있습니다. handle: 프로세스의 핸들값입니다. dwPrior..

ssjune.tistory.com

 

반응형

댓글()

5. [pywin32] SetEvent 함수

pywin32/win32event|2020. 8. 31. 00:32

SetEvent(hEvent)

 

이벤트를 셋트 시키는 함수입니다.

 

인자로는 hEvent : PyHANDLE 가 있습니다.

 

hEvent: 셋트 시킬 이벤트의 핸들입니다. 보통 OpenEvent 함수의 리턴값을 사용하게 됩니다.

 

import win32event
import win32con
import win32api

evtHandle = win32event.OpenEvent(win32event.EVENT_ALL_ACCESS, win32con.FALSE, "eventTest")

win32event.SetEvent(evtHandle)

win32api.CloseHandle(evtHandle)

위의 함수 예제도 WaitForSingleObject 함수의 예제를 실행시킨 후 파이썬을 하나 더 실행시켜서 해보셔야 합니다.

* 현재 WaitForSingleObject 함수의 시간이 3초(3000ms)로 되어 있는데 시간이 부족하면 더 늘리셔도 무방합니다.

 

[pywin32/win32event] - 3. [pywin32] WaitForSingleObject 함수

 

3. [pywin32] WaitForSingleObject 함수

int = WaitForSingleObject(hHandle, milliseconds ) 이벤트 하나를 등록시켜놓고 이벤트가 셋트 되면 이를 알려주는 함수입니다. 인자로는 hHandle : PyHANDLE, milliseconds : int 가 있습니다. hHandle: 대기상..

ssjune.tistory.com

 

실행 결과 셋트되었습니다.

 

반응형

'pywin32 > win32event' 카테고리의 다른 글

7. [pywin32] PulseEvent 함수  (0) 2020.08.31
6. [pywin32] ResetEvent 함수  (0) 2020.08.31
4. [pywin32] OpenEvent 함수  (0) 2020.08.31
3. [pywin32] WaitForSingleObject 함수  (0) 2020.08.31
2. [pywin32] CreateEvent 함수  (0) 2020.08.30

댓글()

4. [pywin32] OpenEvent 함수

pywin32/win32event|2020. 8. 31. 00:22

PyHANDLE = OpenEvent(desiredAccess, bInheritHandle , name )

 

CreateEvent로 만들어진 이벤트를 여는 함수입니다.

 

인자로는 desiredAccess : int, bInheritHandle : bool, name : PyUnicode 가 있습니다.

 

desiredAccess는 접근 권한을 나타냅니다.

 - win32event.EVENT_ALL_ACCESS: 객체에 대한 모든 권한을 부여합니다.

 - win32event.EVENT_MODIFY_STATE: 수정상태로 SetEvent, ResetEvent, PulseEvent 함수 사용 시 필요합니다.

 - win32event.SYNCHRONIZE: (NT만 가능) 동기화를 위해 사용합니다.

 

bInheritHandle은 TRUE/FALSE 둘 중 하나를 가집니다.

 - win32con.TRUE: OpenEvent는 호출하는 프로그램의 핸들을 상속합니다.

 - win32con.FALSE: OpenEvent는 호출하는 프로그램의 핸들을 상속하지 않습니다.

 

name은 CreateEvent 함수 사용 시 사용했던 이벤트의 이름입니다.

 

Return 값은 오픈한 이벤트의 핸들값입니다.

 

import win32event
import win32con
import win32api

evtHandle = win32event.OpenEvent(win32event.EVENT_ALL_ACCESS, win32con.FALSE, "eventTest")

win32api.CloseHandle(evtHandle)

참고로 위의 예제는 WaitForSingleObject 함수의 예제를 실행시킨 후 파이썬을 하나 더 실행시켜서 해보셔야 합니다.

 

그렇지 않으면 eventTest 라는 이름의 이벤트를 찾을 수 없다고 나옵니다.

 

[pywin32/win32event] - 3. [pywin32] WaitForSingleObject 함수

 

3. [pywin32] WaitForSingleObject 함수

int = WaitForSingleObject(hHandle, milliseconds ) 이벤트 하나를 등록시켜놓고 이벤트가 셋트 되면 이를 알려주는 함수입니다. 인자로는 hHandle : PyHANDLE, milliseconds : int 가 있습니다. hHandle: 대기상..

ssjune.tistory.com

 

반응형

'pywin32 > win32event' 카테고리의 다른 글

6. [pywin32] ResetEvent 함수  (0) 2020.08.31
5. [pywin32] SetEvent 함수  (0) 2020.08.31
3. [pywin32] WaitForSingleObject 함수  (0) 2020.08.31
2. [pywin32] CreateEvent 함수  (0) 2020.08.30
1. [pywin32] win32event 소개  (0) 2020.08.20

댓글()

3. [pywin32] WaitForSingleObject 함수

pywin32/win32event|2020. 8. 31. 00:08

int = WaitForSingleObject(hHandle, milliseconds )

 

이벤트 하나를 등록시켜놓고 이벤트가 셋트 되면 이를 알려주는 함수입니다.

 

인자로는 hHandle : PyHANDLE, milliseconds : int 가 있습니다.

 

hHandle: 대기상태로 둘 이벤트 핸들입니다.

 

milliseconds: 정한 시간 만큼만 이벤트가 대기하고, 시간이 지나면 타임 아웃이 발생합니다.

 - win32event.INFINITE: 대기 시간을 무한으로 설정합니다.

 

Return Value: 함수 성공 시 리턴값은 이벤트가 왜 대기 상태에서 깨어났는지에 따라 달라집니다,

 - win32event.WAIT_ABANDONED: 뮤텍스 객체가 종료되거 전 제대로 반환되지 않았을 때

 - win32event.WAIT_OBJECT_0: 이벤트가 셋트 되어서 깨어 났을 때

 - win32event.WAIT_TIMEOUT: milliseconds에서 정한 시간이 지나 타임 아웃이 발생했을 때

 

import win32event
import win32con
import win32api

evtHandle = win32event.CreateEvent(None, win32con.FALSE, win32con.FALSE, "eventTest")

while True:
    x = win32event.WaitForSingleObject(evtHandle, 3000)
    if x == win32event.WAIT_OBJECT_0:
        print(f"signaled #1")
        break
    elif x == win32event.WAIT_TIMEOUT:
        print(f"time out")
        break

win32api.CloseHandle(evtHandle)

CreateEvent 함수에서 추가된 코드로, 3초(3000ms)만큼 대기시킨다.

 

그 결과 타임 아웃이 발생하였다.

 

반응형

'pywin32 > win32event' 카테고리의 다른 글

6. [pywin32] ResetEvent 함수  (0) 2020.08.31
5. [pywin32] SetEvent 함수  (0) 2020.08.31
4. [pywin32] OpenEvent 함수  (0) 2020.08.31
2. [pywin32] CreateEvent 함수  (0) 2020.08.30
1. [pywin32] win32event 소개  (0) 2020.08.20

댓글()

2. [pywin32] CreateEvent 함수

pywin32/win32event|2020. 8. 30. 23:54

PyHANDLE = CreateEvent(EventAttributes, bManualReset , bInitialState , Name )

 

이벤트를 생성하는 함수입니다.

 

인자로는 EventAttributes : PySECURITY_ATTRIBUTES, bManualReset : bool, bInitialState : bool, Name : PyUnicode 가 있습니다.

 

EventAttributes는 이벤트에 대한 보안 속성이며, None으로 두어도 무방합니다.

 

bManualReset은 win32con.TRUE/FALSE 2개의 값을 갖을 수 있습니다.

 - win32con.TRUE: win32event.ResetEvent 함수를 개발자가 수동으로 호출해주어야 합니다.

 - win32con.FALSE: win32event.SetEvent 함수 호출 후 자동으로 ResetEvent 함수가 호출됩니다.

 

bInitialState는 win32con.TRUE/FALSE 2개의 값을 갖을 수 있습니다.

 - win32con.TRUE: 최초 이벤트 상태가 셋트 상태입니다.

 - win32con.FALSE: 최초 이벤트 상태가 리셋 상태입니다.

 

Name: 문자열 값이며, 이벤트의 이름을 지정해줍니다.

 

import win32event
import win32con
import win32api

evtHandle = win32event.CreateEvent(None, win32con.FALSE, win32con.FALSE, "eventTest")

win32api.CloseHandle(evtHandle)

 

eventTest라는 이름으로 이벤트를 생성하였습니다.

* 생성된 이벤트는 win32api의 CloseHandle 함수를 닫을 수 있습니다.

반응형

'pywin32 > win32event' 카테고리의 다른 글

6. [pywin32] ResetEvent 함수  (0) 2020.08.31
5. [pywin32] SetEvent 함수  (0) 2020.08.31
4. [pywin32] OpenEvent 함수  (0) 2020.08.31
3. [pywin32] WaitForSingleObject 함수  (0) 2020.08.31
1. [pywin32] win32event 소개  (0) 2020.08.20

댓글()