오늘 열심히 툴을 만들다가 또 쓰레드 때메 지난 번이랑 똑같은 문제로 고생하는 거도 피곤하고- 하나밖에 못넘겨주는 파라미터로 다이얼로그를 넘겨도 UpdateData도 안되고 여기저기 걸리는게 많아서 고생ㅠ (지난번에 고생해서 알아냈다시피 쓰레드 내에서는 윈도우(UI쪽)를 건드리지 않는 것이 상책이다.) 그래서 이승희 주임님한테 물어봤다 -_- (창환이 말로는 Windows UI 프로그래밍 쪽으로 일가견이 있으시다고)
UI와 내부 연산을 분리할 것 UI 관련 부분 (윈도우로부터 데이터를 받아오거나 출력하거나, 윈도우 상태를 변경하는 부분) 들이 쓰레드 안에 들어가서 파일을 옮기고 프로세스를 실행하는 등의 실제 연산 중간중간에 박혀있다. 작업 쓰레드 내에서 UI 관련 연산을 하는 건 안좋은 습관.
초기화를 비롯한 실행 조건 처리는 첫부분에서 한꺼번에 할 것 파일을 복사할 경로를 확인하고 파일 복사, V3 경로 확인하고 실행. 이런 식으로 그 때 그 때 확인하는 것보다는 실행하는데 필요한 모든 조건을 확인한 후에 작업을 시작하도록.
예외처리 이 코드에서는 안나타나지만 파일 이동에 대해서 예외처리를 제대로 해주지 않았다. 어떤 이유에서든 연산이 실패할 가능성이 있으면 예외처리 루틴으로 가도록-
------------------
사실 저 모든게 쓰레드를 제대로 사용할 줄 몰라서 그런거다 -_- 저 연산들이 순차적으로 실행되어야하는 연산이기 때문에 WaitForSingleObject 를 써서 기다려야되는데 Thread의 경우는 WaitForSingleObject의 파라메터로 CThread 포인터를 바로 넘기는게 아니라 CThread->m_hThread를 넘겨줘야 한단다.
전에 한번 WaitForSingleObject 써봤는데 쓰레드만 생성하고 바로 돌아와서 메인쓰레드랑 동시에 실행되는 바람에 순차적 실행이 안됐던 적이 있었는데 핸들값을 잘못 넘겨줬기 때문이었나보다.
여튼 그래서 순차적으로 실행되도록 하려고 쓰레드에 다 밀어넣고 했는데 이러면 안된다고 하시는군. Cleaner.MoveSample(), V3.Run(), Cleaner.RemoveEmptyFolder() 만 각각 쓰레드를 생성하여 실행하는 것이 좋다고 한다.
void CMoveDlg::OnOK() { // TODO: Add extra validation here GetDlgItem(IDOK)->EnableWindow(false); GetDlgItem(IDC_STATIC_STATUS)->SetWindowText(" 샘플 복사 중");
// V3 검사 수행 GetDlgItem(IDC_STATIC_STATUS)->SetWindowText(" V3 실행 중 - 종료하지마세요"); //sprintf(tgtpath, "%s%04d%02d", tgtpath, m_year, m_month); // 경로 설정 CExcuteProgram *pV3 = new CExcuteProgram("V3", programpath, tgtpath);
// 바이러스 검사 쓰레스 실행 -> 리턴값 확인 pThread = AfxBeginThread(V3RunThread, (LPVOID)pV3); if( pThread != NULL){ // 검사 종료 윈도우를 찾아서 닫아주는 쓰레드 실행 AfxBeginThread(CloseV3WindowThread, pThread); WaitForSingleObject(pThread->m_hThread, INFINITE); } else{ GetDlgItem(IDC_STATIC_STATUS)->SetWindowText("쓰레드를 생성할 수 없습니다"); GetDlgItem(IDOK)->EnableWindow(TRUE); return; }
GetDlgItem(IDC_STATIC_STATUS)->SetWindowText(" 빈 폴더 삭제 중");
Working Thread와 UI Thread를 분리해야한다는 말은 많이 들었지만 어떻게 해야하는지 잘 몰랐는데 대충 이렇게 하는건가;; 조금 깔끔해 진것 같긴 하지만 어설프다. 그래도 그럭저럭 필요한 기능은 전부 구현이 되서 만족 ^^ 한가지 아쉬운거라면 저 쓰레드 함수들.. Dialog 밑에 주렁주렁 달려있어서 좀 이상하다는거. 좀 더 깔끔하게 정리된 코드를 짜고 싶다. 디자인 패턴을 공부해야지!
-------------------- 굉장히 부끄러운 일이지만 회사에서 코딩을 하다보면 정직원분들이 상식이라고 생각하는 부분을 나는 잘 모르고 있는 경우가 많아서 정직원들이 내 코드를 보면 왜 이런식으로 짰을까- 라고 놀람을 떠나 어이없어하는 경우가 있다 -_- (변수명이라거나 예외처리라거나 하는 기본적인 부분부터 프로그램의 구조같은 것까지 여러가지 면에서)
정말이지 코딩같은건 어디서 체계적으로 배우는게 아니라서 (공이라고 해도 뭔가 체계를 가지고 배운 적은 없다. 이상한 일이긴 하지만) 참 힘들다. 지식도 지식이지만 코딩 습관 또한 중요한 부분을 차지하는 듯하다.