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 longvoid* 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를보내서 다이얼로그의 변경값을 실시간으로 변경하게 할 수 있습니다.
'Computer > ETC' 카테고리의 다른 글
정보처리 - 데이터베이스 (0) | 2016.02.22 |
---|---|
리틀엔디안(little endian)&빅엔디안(big endian) (0) | 2015.08.26 |
VS2013, 플러그인 없애고 싶은데... (0) | 2014.04.25 |
운영체제의 주요 구성 기술 (0) | 2014.03.27 |
항목4: 객체를 사용하기 전에 반드시 그 객체를 초기화하자 (0) | 2014.03.20 |
운영체제의 개요 (0) | 2014.03.12 |
회선 (0) | 2013.05.07 |
포인트 처리_XOR연산, 룩업테이블 (0) | 2013.05.07 |