Computer/ETC Updated: 2014. 3. 27. 10:17 hwaya.

Thread(스레드)

반응형

메인스레드 외에 다른 스레드를 사용하여 비동기로 동작할 필요성을 느끼게된다.

이럴때 스레드를 사용하여 각각 독립적인 동작으로 사용할 수 있다.

스레드를 분리하지 않고 메인스레드로만 이용한다면 다량의 데이터를 연산, 관리하는 부분에서 동작을 실행중이기 때문에 다른것들은 하지 못하고 그 동작이 끝날때 까지 기다려야한다.


스레드는 메인스레드와 독립된 동작이기 때문에 멤버변수나 해당클래스의 객체를 이용해서 접근해야한다.

스레드 함수 안에서 해당클래스의 변수나 함수로 바로 접근할 수 없다.


.h 헤더

//타입은 UINT를 해야 하고 매개변수 lParam을 넘겨 주어야 한다

static UINT ThreadProc(void *lParam);

 

.cpp 구현

AfxBeginThread(ThreadProc, this); <--실행함수


UINT CconfigEXDlg::ThreadProc(void *lParam)
{

CconfigEXDlg* pDlg = (CconfigEXDlg*)lParam;
for(int i = pDlg->nNum1; i<pDlg->nNum2; i++)
{
    pDlg->m_nResult += i;
    pDlg->SetDlgItemInt(IDC_EDT_THREAD3, pDlg->m_nResult);
    Sleep(10);
}
pDlg->m_nResult = 0;


return 0;
}



//=================== _beginthreadex 활용 ==========================//

.h

static UINT WINAPI ThreadProc(PVOID lParam);  //WINAPI 까지 선언해야 한다

 

.cpp

int thread;
m_Thread = (HANDLE)_beginthreadex(NULL, 0, &ThreadProc, this, 0, (UINT*)&thread); <--실행

 
unsigned long _beginthreadex( //리턴 타입 unsigned long
void* security, //보안 변수 (void*)
unsigned stack_size, //초기 스택 사이즈 (unsigned int) <--디폴트 0으로 하면 메인스레드와 같은 크기로 할당 된다. 거의 변경할 일이 없으므로 디폴트 값을 사용
unsigned (*start_address)(void*), //스레드 함수 모듈 (반환형 UINT)
void* arglist, //스레드 인자 (void*)
unsigned initflag, //생성 옵션 (unsigned int)
unsigned* thrdaddr //스레드 ID (unsigned int*)

 

_beginthreadex()로 생성된 스레드 핸들은 스레드가 실행완료된 후 내부적으로 CloseHandle()을 실행시키지 않기 때문에 스레드 핸들을 이용한 API 함수를 실행할 수 있지만 사용자가 명시적으로 CloseHandle()을 호출해 주어야 합니다. 만약 CloseHandle()을 해주지 않으면 핸들이 계속 쌓이게 되는 Resource leak이 생기게 됩니다.




MFC 객체들(특히, Window Handle을 가진 객체들)은 쓰레드를 넘어서 공유되지 않는다.

이때 MFC 객체들이 window handle을 thread local storage에 보관하기 때문이다.

그러므로 그 객체들은 항상 per-thread로 관리되다.

 

CWinThread의 m_bAutoDelete가 TRUE로 되어있으면

쓰레드 종료시 delete가 되어벼려 쓰레드의 핸들값이 invalid가 된다

고로 WaitForSingleObject로 CWinThread를 기다리기 위해선

항상 m_bAutoDelete를 FALSE로 해놓고 기다려야한다.




다이얼로그 사용시특정동작을 실행하면 특정동작이 돌아가는 동안 다이얼로그가 먹통이 됩니다. 이를 해결하기 위해 쓰레드를 사용하게되는데 이때 쓰레드 안에서 바로 UpdateData함수를 사용하면 에러가 발생합니다. 이를 해결하기 위해 윈도우에 메세지로 UpdateData를보내서 다이얼로그의 변경값을 실시간으로 변경하게 할 수 있습니다.

반응형

Table of Contents


    EIGHTBOX
    EIGHTBOX
    hwaya.

    programmer

    🍋일상의 소소한 순간들부터 큰 꿈까지, 호기심을 만족시킬 다양한 카테고리를 담은 블로그 입니다. 그리고, 소소한 행동에 감동하며 기뻐하고 하루하루에 감사하는 사람🌵

    Today Yesterday Total
    최신글