컴퓨터 공부/Win32 API 프로그래밍

[5월 11일 1교시] 멀티 쓰레드 2

려리군 2009. 5. 11. 15:23

CreateProcess 함수는 프로세스를 생성한 후 곧바로 리턴.

 - FindWindow로 윈도우 핸들을 찾지 못함.


DWORD WINAPI WaitForInputIdle(__in  HANDLE hProcess, __in  DWORD dwMilliseconds);

참고주소 : http://msdn.microsoft.com/en-us/library/ms687022.aspx

초기화가 완료될 때까지(사용자의 입력을 대기할 수 있을 때까지) 기다림.

리턴 : 성공시 0, timeout이 지나갔을 경우 WAIT_TIMEOUT, 실패시 WAIT_FAILED

hProcess : 프로세스 핸들. 콘솔 프로그램이나 메세지 큐가 없으면 곧바로 리턴.

dwMilliseconds : 밀리초 단위의 timeout간격. INFINITE면 프로세스가 idle할 때까지 기다림.


명령행 인수

1. lpszCmdParam(WinMain만 가능) : 프로그램 명은 제외하고 명령행 인수 전체가 통째로 하나의 문자열로 전달.(WinMain)

2. __argc, __argv 전역변수 : 도스에서와 의미 동일, __argc는 전달인수 개수. __argv는 인수 문자열 배열 포인터

3. LPTSTR GetCommandLine();와 LPWSTR *CommandLineToArgvW(LPCWSTR, int*);

LPTSTR WINAPI GetCommandLine(void);

참고주소 : http://msdn.microsoft.com/en-us/library/ms683156(VS.85).aspx

리턴 : 현재 프로세스의 명령행 줄 문자열의 포인터.

명령행 인수 전체 문자열을 전달. 유니코드 명령행 인수도 읽을 수 있다.

LPWSTR *CommandLineToArgvW(__in    LPCWSTR lpCmdLine,__out    int *pNumArgs);

참고주소 : http://msdn.microsoft.com/en-us/library/bb776391(VS.85).aspx

명령행 인수들을 각 토큰 단위로 나눈다. 유니코드형 변수로 읽고 리턴한다.

리턴 : argv와 비슷한 LPWSTR의 포인터 배열

lpCmdLine : 0으로 끝나며 모든 명령 줄을 포함하는 유니코드 문자열의 포인터.

pNumArgs : argc와 비슷하게 배열 개수를 리턴.


프로세스 종료

VOID ExitProcess(UINT uExitCode);

1. DLL정리 - 각 DLL의 dllMain함수가 호출되어 스스로 정리작업을 한다.

2. 모든 열려진 핸들을 닫는다.

3. 실행중인 모든 쓰레드를 종료.

4. 이 객체를 기다리는 다른 프로세스는 대기 상태를 해제할 수 있다.

5. 종료코드는 STILL_ACTIVE에서 nExitCode값이 된다.


BOOL WINAPI TerminateProcess(__in  HANDLE hProcess, __in  UINT uExitCode);

참고주소 : http://msdn.microsoft.com/en-us/library/ms686714(VS.85).aspx

특정 프로세스와 그 쓰레드들을 모두 종료한다.

리턴 : 성공시 TRUE, 실패시 FALSE

hProcess : 종료시킬 프로세스의 핸들, 핸들은 PROCESS_TERMINATE 접근 정보를 가져야 함.

uExitCode : 이 호출의 결과로서 종료된 프로세스나 쓰레드에 의해 사용될 종료 코드


프로세스 핸들

USER 객체 : 윈도우 관리에 사용. 시스템 전역적.

GDI 객체 : 그래픽을 위해 사용. 해당 객체는 만든 프로세스 내에서만 사용 가능.

커널 객체 : 메모리 프로세스 IPC 동기화 등에 사용되는 객체. 프로세스(시스템) 한정적.


프로세스 한정적 : 한 프로세스가 만든 핸들은 다른 프로세스에서 곧바로 사용할 수 없되 대신 다른 프로세스가 같은 객체를 다시 open하여 또 다른 핸들을 사용가능.


HANDLE WINAPI OpenProcess(__in  DWORD dwDesiredAccess, __in  BOOL bInheritHandle, __in  DWORD dwProcessId);

참고주소 : http://msdn.microsoft.com/en-us/library/ms684320(VS.85).aspx

현재 있는 프로세스를 연다.

리턴 : 성공시 열려 있는 프로세스의 핸들을 리턴 실패시 NULL을 리턴.

dwDesiredAccess : 프로세스에 대한 접근 권한. 프로세스의 security descriptor에 의해 검사된다.

bInheritHandle : TRUE면 핸들은 이 프로세스에 의해 만들어진 프로세스들은 핸들을 상속할 것이다. FALSE면 상속하지 않을 것이다.

dwProcessID : 열리게 될 프로세스의 ID. 0x00000000이면 시스템 프로세스기 때문에 오류 발생.


BOOL WINAPI GetExitCodeProcess(__in   HANDLE hProcess, __out  LPDWORD lpExitCode);

참고주소 : http://msdn.microsoft.com/en-us/library/ms683189(VS.85).aspx

특정 프로세스의 종료 상태를 얻는다.

리턴 : 성공시 TRUE, 실패시 FALSE

hProcess : 프로세스의 핸들. 핸들은 PROCESS_QUERY_INFORMATION 계열의 접근 권한이 있어야 된다.

lpExitCode : 프로세스 종료 상태를 받을 변수 포인터.(ExitProcess, TerminateProcess, main, Winmain, 프로세스 종료를 야기한 처리되지 않는 예외값.)


쓰레드 방식으로 변경 

OS scheduler가 쓰레드를 책임진다.

쓰레드 라이브러리를 사용하는 이유 : 쓰레드에 안전한 함수들을 여러 쓰레드에서 사용할 수 있게 해 준다.


HANDLE WINAPI CreateThread(__in_opt   LPSECURITY_ATTRIBUTES lpThreadAttributes, __in       SIZE_T dwStackSize, __in       LPTHREAD_START_ROUTINE lpStartAddress, __in_opt   LPVOID lpParameter, __in       DWORD dwCreationFlags,

  __out_opt  LPDWORD lpThreadId);

참고주소 : http://msdn.microsoft.com/en-us/library/ms682453.aspx

호출한 프로세스의 가상 주소 공간에서 실행할 쓰레드를 생성한다.

다른 프로세스의 가상 주소 공간에서 실행될 쓰레드를 만들려면 CreateRemoteThread 함수를 사용하라.

리턴 : 성공시 새 쓰레드에 대한 핸들. 실패시 NULL

lpThreadAttributes : 돌아온 핸들값이 자식 프로세스에 의해 상속될 수 있는 지 결정하는 구조체 포인터. NULL이면 상속되지 않는다.

dwStackSize : 바이트 단위로 스택의 초기화 크기. 0이면 기본 크기를 사용하는 쓰레드 생성.

lpStartAddress : 쓰레드에 의해 실행될 응용프로그램에서 정의된 함수포인터.

lpParameter : 쓰레드에 넣은 변수 포인터

dwCreationFlags : 쓰레드 생성을 제어할 플래그. CREATE_SUSPENDED : 잠시멈춘 상태로 쓰레드 생성

lpThreadId : 쓰레드 ID를 받을 변수 포인터. NULL이면 받지 않음.


BOOL WINAPI GetExitCodeThread(__in   HANDLE hThread, __out  LPDWORD lpExitCode);

참고주소 : http://msdn.microsoft.com/en-us/library/ms683190.aspx

특정 쓰레드의 종료 상태를 얻는다.

리턴 : 성공시 TRUE, 실패시 FALSE

hThread : 쓰레드 핸들. 핸들은 THREAD_QUERY_INFORMATION 관련 접근 권한을 가져야 한다.

lpExitCode : 쓰레드 종료 상태을 얻을 변수 포인터. 바로 상태를 리턴한다.

 - 쓰레드가 작동 중이고 함수호출 성공시 : STILL_ALIVE

 - 쓰레드가 종료되었고 함수 호출시 : ExitThread, TerminatedThread함수의 종료 값, 쓰레드 함수의 리턴값. 쓰레드 프로세스의 종료값


VOID WINAPI ExitThread(__in  DWORD dwExitCode);

참고주소 : http://msdn.microsoft.com/en-us/library/ms682659.aspx

호출한 쓰레드를 종료한다. (응용 프로그램에서 정의된 함수에서 사용.)

dwExitCode : 쓰레드를 위한 종료 코드


BOOL WINAPI TerminateThread(__inout  HANDLE hThread, __in     DWORD dwExitCode);

참고주소 : http://msdn.microsoft.com/en-us/library/ms686717(VS.85).aspx

쓰레드를 종료시킨다.

리턴 : 성공시 TRUE, 실패시 FALSE

hThread : 종료될 쓰레드의 핸들. 핸들은 THREAD_TERMINATE 접근 권한이 있어야 한다.

dwExitCode : 쓰레드에 대한 종료코드


DWORD WINAPI SuspendThread(__in  HANDLE hThread);

참고주소 : http://msdn.microsoft.com/en-us/library/ms686345(VS.85).aspx

특정 쓰레드를 일시정지 시킨다.

리턴 : 성공시 쓰레드의 이전 일시정지된 카운트값. 실패시 -1.

hThread : 일시정지될 쓰레드 핸들


DWORD WINAPI ResumeThread(__in  HANDLE hThread);

참고주소 : http://msdn.microsoft.com/en-us/library/ms685086(VS.85).aspx

쓰레드의 일시정지 카운트 값을 감소한다. 이 일시정지 값이 0이되면 쓰레드의 실행이 재개될 것이다.

리턴 : 성공시 쓰레드의 이전 일시정지된 카운트값. 실패시 -1

hThread : 다시 시작할 쓰레드의 핸들.


우선순위

우선 순위 클래스 : 쓰레드를 소유한 프로세스의 우선순위

우선 순위 레벨 : 프로세스 내에서 쓰레드의 우선 순위

동적우선순위 : 우선 순위가 결정되어도 실제 적용되는 우선순위는 시스템에 의해 변함.


BOOL WINAPI SetThreadPriority(__in  HANDLE hThread, __in  int nPriority);

참고주소 : http://msdn.microsoft.com/en-us/library/ms686277(VS.85).aspx

특정 쓰레드에 대한 우선순위 값을 설정한다. 이 값은 우선순위 클래스와 결합하여 쓰레드의 기본 우선순위를 결정하게 된다.

리턴 : 성공시 TRUE, 실패시 FALSE

hThread : 우선순위 값을 설정하게 될 쓰레드의 핸들. 핸들은 THREAD_SET_INFORMATION 계열의 권한을 가지고 있어야 한다.

nPriority : 쓰레드에 대한 우선순위 값.


int WINAPI GetThreadPriority(__in  HANDLE hThread);

참고주소 : http://msdn.microsoft.com/en-us/library/ms683235.aspx

특정 쓰레드에 대한 우선순위 값을 얻는다. 

리턴 : 성공시 쓰레드 우선순위 값을 얻는다. 실패시 THREAD_PRIORITY_ERROR_RETURN

hThread : 쓰레드의 핸들. THREAD_QUERY_INFORMATION 계열의 권한을 가지고 있어야 한다.