Threads and Thread synchronization
Threads
MFC는 2종류의 쓰레드로 구분할 수 있다.
1. user interface threads
2. worker threads
%이 둘간의실질적인 차이는 아직 잘모르겠다. 좀 더 학습하도록
-Creating a Worker Thread
AfxBeginThread함수는 ui-thread,worker thread 둘다 쓰인다. MFC프로그램에서 Win32::CreateThread함수를 사용하지 말아라.
ex)
CWinThread* pThread = AfxBeginThread (ThreadFunc, &threadInfo);
UINT ThreadFunc (LPVOID pParam)
{
UINT nIterations = (UINT) pParam;
for (UINT i=0; i<nIterations; i++);
return 0;
}
CWinThread* AfxBeginThread (AFX_THREADPROC pfnThreadProc,
LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0, DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL)
nPriority : 쓰레드 우선순위. 쓰레드들 중에서만 상대적인 우선순위를 정할때 사용한다.
nStackSize : 쓰레드의 스택사이즈 라는데 정확히 뭔지..몰라.
dwCreateFlags : 0 일 경우, 이 함수 호출후 바로 쓰레드가 시작되는 것이고,
CREATE_SUSPENDED일 경우, ResumeThread()가 호출되어야지만 시작되는것이다.
lpSecurityAttrs : 몰라도 ??.
--Thread Function prototype
콜백함수이기에 static class 멤버 함수이거나 클래스 밖에 선언된 전역함수이어야 한다.
UINT ThreadFunc( LPVOID pParam )
pParam : 32비트값. AfxBeginThread 함수의 파라미터. 이것은 scalar,handle,객체포인터로도 사용되어 질수 있다.
-Creating a UI Thread
CWinThread를 상속받은 클래스를 사용한다.
ex)
class CMyThread : public CWinThread
CMyThread * pThread = AfxBeginThread(RUNTIME_CLASS(CMyThread),
THREAD_PRIORITY_NORMAL,
0, // stack size
CREATE_SUSPENDED);
pThread->초기값 설정.
pThread->ResumeThread();
또는
CMyThread * pThread = new CMyThread();
pThread->초기값 설정.
pThread->CreateThread();
-Suspending and Resuming Threads
SuspendThread를 호출하면 쓰레드는 멈추고, 내부적으로 Suspend count 가 1 증가 한다. 그리고 ResumeThread를 호출하면 Suspend count는 1 줄고 쓰레드는 다시 움직인다.
ResumeThread는 자신이 호출 할 수 없다. 그리고 이들 함수의 리턴값은 쓰레드의 이전 Suspend Count이다.
-Putting Threads to sleep
::Sleep(0)
현재쓰레드를 중지하고 스케쥴러가 동등한 혹은 높은 우선순위를 갖는 다른 쓰레드를 움직이도록 허락해준다. 만약, 다른 동등한 혹은 높은 우선순위의 쓰레드가 wait 상태가 아니라면, 이 함수는 바로 리턴해서 현재쓰레드를 재시작 한다. (::SwitchToThread.(in NT 4.0 ), ::Sleep(0) (in win32 ))
Sleep함수의 시간은 정확하지 않을 수 있다. 이는 여러환경에 지배받기때문이다. 윈도우즈에서는 쓰레드의 suspend 시간을 보장하는 함수는 존재하지 않는다.
'WORK > Sotfware' 카테고리의 다른 글
Edit Clear (0) | 2008.06.02 |
---|---|
RS232 통신 (0) | 2008.06.02 |
MFC Thread 완전정복 ( 마지막 ) (0) | 2008.06.02 |
MFC Thread 완전정복 3 - 동기화 (0) | 2008.06.02 |
MFC Thread 완전정복 2 - Thread 종료하기 (0) | 2008.06.02 |
댓글