엔코더 프로그램 설명 // 쓰레드를 사용하기 때문에 변수와 핸들을 전역변수로 지정 HANDLE hDevice; BOOL bKillThread=FALSE, bThreadActive=FALSE; int enc_cnt = 0; UINT thread(LPVOID lParam); //쓰레드 함수 선언 <중략> void CEncoderDlg::OnEncoderOn() { // 엔코더 카운트값을 계측하기 위하여 쓰레드를 시작한다. // AfxBeginThread(thread, this); SetTimer(0, 50, NULL); //타이머 시작 } void CEncoderDlg::OnEncoderOff() { // Thread를 종료시킨다. bKillThread = TRUE; KillTimer(0); //타이머 종료 void CEncoderDlg::OnTimer(UINT nIDEvent) { // 현재의 엔코더 펄스수를 디스플레이 한다. m_encoder = enc_cnt; UpdateData(FALSE); CDialog::OnTimer(nIDEvent);
UINT thread(LPVOID lParam) { ULONG di_states; bKillThread = FALSE; bThreadActive = TRUE; while(!bKillThread) di_states =COMI_DI_GetAll(hDevice); if(!(di_states & 0x01)){ while(!(di_states & 0x01)){ di_states = COMI_DI_GetAll(hDevice); if(bKillThread){ break; } if(di_states & 0x02) enc_cnt--; else enc_cnt++; bThreadActive = FALSE; return 0;
스레드란? 스레드란 하나의 독립적인 작업의 단위 : 다른것에 구애 받지않는 자체적인 작업 단위를 스레드라고 함 윈도95는 멀티 테스킹이 가능한 운영체제. 즉 동시에 여러 작업을 할수 있다. CPU 자체는 한스텝에 한 개의 작업밖에는 하지 못함, 그렇다면 어떻게 윈도95는 멀티테스킹이 가능할까?-> 시간 분할( CPU의 처리 속도가 1초에 99개의 작업 한다고 하고 현재 A,B,C 3개의 프로그램이 동작중이라고 예를 들면 1초에 CPU는 프로그램의 우선순위에 따라 A에 해당하는 작업 50개 B에 해당하는작업 30개 C에 해당하는 작업 19개의 작업을 함 -> 이렇게 작업을 함으로써 사용자가 보기에 여러 작업을 동시에 하는 것처럼 보이게 할 수 있슴. 이때 하나의 작업 단위들을 스레드라고 함) 예) 윈도에서 워드 프로세서를 띄우고 대용량의 데이터를 로드하여 프린터로 출력할때 게다가 인터넷을 통해서 큰 데이터를 다운 받을때 : 원드프로세서의 입력작업이 하나의 스레드 + 프린팅 작업이 하나의 스레드 + 다운 로드가 또하나의 스레드 -> 멀티 스레드 UINT ThreadProcess(LPVOID lParam); // ThreadProcess라는 함수 선언 AfxBeginThread(ThreadProcess, this); // 위의 함수를스레드로 실행
Thread 함수 작성 UINT ThreadProcess(LPVOID lParam); //99999까지 카운트 하는 프로그램 UINT ThreadProcess(LPVOID lParam) { while(m_bBreak) // Display Count str.Format("%05d",i); i++; if(i>99999) i=0; dc.TextOut(100, 0, str); } //Dispaly "End Thread" dc.TextOut(0, 0, _T("EndThread")); return 0; m_bBreak = TRUE 로 초기화
AfxBeginThread 스레드를 작동하는 함수 : AfxBeginThread(………); CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID lParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ); pfnThreadProc : 스레드를 수행하는 함수 LPVOID lParam : pfnThreadProc에 넘겨줄 인자의 포인터 변수 nPriority : 스레드의 중요 순위 ThreadProcess함수의 인자가 LPVOID lParam 인 것은 AfxBeginThread함수에서 임의의 lParam의 인자를 받기 위해서 ThreadProcess함수를 스레드로 실행 AfxBeginThread(ThreadProcess, this); ThreadProcess함수를 스레드로 종료 m_bBreak = FALSE;