글 수 429
음 일단 쓰레드를 사용하는 파일은
CAutoLoad 클래스 하나뿐이구요.
CustomDic에 포함됩니다.
5초마다 한번씩 파일리스트에 등록된 파일의 수정된 날짜를 체크해서
새로 갱신된것이면 새로 읽는다...라는 기능을 가지고 있는데,
애초부터 쓰레드가 동작조차 하지 않습니다.
어떻게 해야할까요;
CAutoLoad 클래스 하나뿐이구요.
CustomDic에 포함됩니다.
5초마다 한번씩 파일리스트에 등록된 파일의 수정된 날짜를 체크해서
새로 갱신된것이면 새로 읽는다...라는 기능을 가지고 있는데,
애초부터 쓰레드가 동작조차 하지 않습니다.
어떻게 해야할까요;
#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; };
#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. 쓰레드가 혹시 한번 돌고 그대로 종료되지 않았는가?
인 것 같군요. 각각 디버그 메세지를 띄우거나 디버거를 넣어 확인해 보세요.