글 수 429
음 일단 쓰레드를 사용하는 파일은
CAutoLoad 클래스 하나뿐이구요.
CustomDic에 포함됩니다.
5초마다 한번씩 파일리스트에 등록된 파일의 수정된 날짜를 체크해서
새로 갱신된것이면 새로 읽는다...라는 기능을 가지고 있는데,
애초부터 쓰레드가 동작조차 하지 않습니다.
어떻게 해야할까요;
CAutoLoad 클래스 하나뿐이구요.
CustomDic에 포함됩니다.
5초마다 한번씩 파일리스트에 등록된 파일의 수정된 날짜를 체크해서
새로 갱신된것이면 새로 읽는다...라는 기능을 가지고 있는데,
애초부터 쓰레드가 동작조차 하지 않습니다.
어떻게 해야할까요;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | #pragma once #include "tstring.h" #include <vector> #include <map> using namespace std; struct DicWord { int WordN; int WordLen; }; class CAutoLoad { public : CAutoLoad( void ); public : ~CAutoLoad( void ); public : void AddDic( LPCWSTR CustomPath); map< int , int > GetKeyIndex(); vector<map< UINT ,DicWord>> GetKeyBook(); vector<string> GetValueList(); int GetWordN(); int GetBookN(); bool GetChanged(); void SetChanged(); void FileClear(); //Load 쓰레드 처리 bool m_bChanged; CWinThread * m_pLoadThread; void Callback(); static UINT CallbackStub( LPVOID param); private : void ResetDic(); void ReadDic( LPCWSTR CustomPath); void SetKey( LPCSTR JpnWord, LPCSTR KorWord); //사전 데이터 map< int , int > KeyIndex; vector<map< UINT ,DicWord>> KeyBook; vector<string> ValueList; int WordN; int BookN; vector<wstring> FileList; vector< DWORD > FileWriteTime; }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | #include "StdAfx.h" #include "AutoLoad.h" #include "SubFunc.h" #include "hash.hpp" volatile bool m_bRunning; CCriticalSection g_cs; CAutoLoad::CAutoLoad( void ) { m_bRunning= true ; m_pLoadThread = AfxBeginThread(CAutoLoad::CallbackStub, this ); } CAutoLoad::~CAutoLoad( void ) { g_cs.Lock(); m_bRunning= false ; g_cs.Unlock(); if (NULL != m_pLoadThread) { ::WaitForSingleObject(m_pLoadThread->m_hThread,INFINITE); delete m_pLoadThread; m_pLoadThread = NULL; } } void CAutoLoad::FileClear() { g_cs.Lock(); FileList.clear(); FileWriteTime.clear(); g_cs.Unlock(); } UINT CAutoLoad::CallbackStub( LPVOID param) { while (1) { Sleep(5000); g_cs.Lock(); if (!m_bRunning) { g_cs.Unlock(); break ; } else { g_cs.Unlock(); static_cast <CAutoLoad*>(param)->Callback(); // 여기서 멤버 함수를 호출해주죠. } } return 0L; } void CAutoLoad::Callback() { //파일체크 개시 g_cs.Lock(); int FileN=( int )FileList.size(); //Size값이 실시간으로 변하지 않도록 g_cs.Unlock(); bool bReload= false ; HANDLE h_file=NULL; for ( int i=0;i<FileN;i++) { h_file=CreateFile(FileList[i].c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (h_file != INVALID_HANDLE_VALUE){ FILETIME create_time, access_time, write_time; // 지정된 파일에서 파일의 생성, 최근 사용 그리고 최근 갱신된 시간을 얻는다. GetFileTime(h_file, &create_time, &access_time, &write_time); CloseHandle(h_file); g_cs.Lock(); if (write_time.dwLowDateTime>FileWriteTime[i]) { FileWriteTime[i]=write_time.dwLowDateTime; bReload= true ; } g_cs.Unlock(); } } if (bReload) { ResetDic(); g_cs.Lock(); for ( int i=0;i<FileN;i++) { ReadDic(FileList[i].c_str()); } m_bChanged= true ; g_cs.Unlock(); } } void CAutoLoad::AddDic( LPCWSTR Path) { g_cs.Lock(); FileList.push_back(Path); FileWriteTime.push_back(0); g_cs.Unlock(); } void CAutoLoad::ReadDic( LPCWSTR Path){ /* 파일 읽기 작업*/ } void CAutoLoad::ResetDic(){ /*초기화 작업*/ } void CAutoLoad::SetKey( LPCSTR JpnWord, LPCSTR KorWord){ /*단어 추가 작업*/ } //이하는 모두 g_cs.Lock(); 데이터빼내고 g_cs.Unlock(); return 데이터 map< int , int > CAutoLoad::GetKeyIndex(){...} vector<map< UINT ,DicWord>> CAutoLoad::GetKeyBook(){...} vector<string> CAutoLoad::GetValueList(){...} int CAutoLoad::GetBookN(){...} int CAutoLoad::GetWordN(){...} bool CAutoLoad::GetChanged(){...} void CAutoLoad::SetChanged(){...} |
어쨌든.. 확인하셔야 할 사항은..
1. CAutoLoad 가 제대로 생성되었는가?
2. 생성 후 쓰레드가 제대로 만들어졌는가? (m_pLoadThread 에 제대로 된 CWinThread 주소가 들어갔는가?)
3. 쓰레드가 혹시 한번 돌고 그대로 종료되지 않았는가?
인 것 같군요. 각각 디버그 메세지를 띄우거나 디버거를 넣어 확인해 보세요.