글 수 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. 쓰레드가 혹시 한번 돌고 그대로 종료되지 않았는가?
인 것 같군요. 각각 디버그 메세지를 띄우거나 디버거를 넣어 확인해 보세요.