Thread 해결 ^____________________^
Posted 2007. 6. 1. 13:08, Filed under: Study/Computer Science어제부터 고민하던 문제 완죤 해결 ㅋㅋㅋ
OK 버튼 눌렀을 때 실행하는 모든 프로시저를 스레드로 만들면 순차실행하는 데 아무런 문제 없음
전에 이런 방식으로 할려다가 Dialog Item 들을 마음대로 사용할 수 없어서 포기했는데 (5번 문제점)
CWnd를 상속한 클래스에서 멤버 함수로 핸들을 가지고 있으니까 이걸 써두 되고..
The m_hWnd data member is a public variable of type HWND
윈도우를 통째로 스레드 프로시저의 파라미터로 넘겨서 캐스팅하면 OnOK 함수 내에서 처럼 사용 가능하다는 것 ^^ .. 다른 맴버 변수에 직접 접근할 수 있기 때문에 이 방법이 더 깔끔하다.
스레드 첨 써봐서 진짜 힘들었는데.. 그럭저럭 인제 어째 되는지는 알겠다.
이번 경우는 스레드간 통신도 없고 동기화도 안해도 되는 별로 어렵지 않은.. 단지 스레드였지만
다음에는 더 어려운거에 도전해봐야지 ㅋㄷ
UINT threadCnt(LPVOID DlgHpcnt)
{
// create class instances
CHpCntDlg* Cntdlg = (CHpCntDlg*)DlgHpcnt; // 이렇게 캐스팅해서 맘껏 사용 ㅋㄷ
HpCounter* hpc = new HpCounter(Cntdlg);
// disable button
Cntdlg->GetDlgItem(IDOK)->EnableWindow(false);
// Homepage upload count
hpc->MakeTmp(); // make temporary folder
Cntdlg->GetDlgItem(IDC_STEP)->SetWindowText("홈페이지 업로드 카운트 중...");
if(Cntdlg->m_CheckINI ==TRUE) {
hpc->WriteINICnt();
}
// Sample Count
Cntdlg->GetDlgItem(IDC_STEP)->SetWindowText("엔진 샘플 수 카운트 중...");
SpCounter* spc = new SpCounter(Cntdlg);
for(int i = 0; i < 7; i++)
{
spc->TotalSample();
spc->ECSample();
spc->MoveDate();
}
CTimeSpan day = CTimeSpan(1,0,0,0);
CTime Date = CTime::GetCurrentTime() - day;
CString szBuffer = _T("");
char szBuf[80] = _T("");
// Print Result
Cntdlg->m_Result.DeleteAllItems();
Cntdlg->GetDlgItem(IDC_STEP)->SetWindowText("결과 출력");
for (i = 0; i < 7; i++){
szBuffer.Format("%8d.%02d.%2d", Date.GetYear(), Date.GetMonth(), Date.GetDay());
Cntdlg->m_Result.InsertItem(LVIF_TEXT, 0, szBuffer, 0, 0, 0, 0);
itoa((spc->arResult[6-i]).nTotalSample, szBuf, 10);
Cntdlg->m_Result.SetItemText(0, 1, szBuf);
itoa((spc->arResult[6-i]).nECSample, szBuf, 10);
Cntdlg->m_Result.SetItemText(0, 2, szBuf);
itoa((hpc->arResult[6-i]).nKorCnt, szBuf, 10);
Cntdlg->m_Result.SetItemText(0, 3, szBuf);
itoa((hpc->arResult[6-i]).nEngCnt, szBuf, 10);
Cntdlg->m_Result.SetItemText(0, 4, szBuf);
Date -= day;
}
//enable Run button
Cntdlg->GetDlgItem(IDOK)->EnableWindow(true);
return 0;
}