본문 바로가기

쓰기

음 일단 쓰레드를 사용하는 파일은
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(){...}


분류 :
Talk
조회 수 :
10808
등록일 :
2008.12.25
20:42:46
엮인글 :
https://arallab.hided.net/4117/54f/trackback
게시글 주소 :
https://arallab.hided.net/board_devtalk/4117

whoami

2008.12.26
21:27:55
음. 눈에 바로 띄는 것은 특별히 없군요.. 실제로 돌려보지 않으면;;

어쨌든.. 확인하셔야 할 사항은..
1. CAutoLoad 가 제대로 생성되었는가?
2. 생성 후 쓰레드가 제대로 만들어졌는가? (m_pLoadThread 에 제대로 된 CWinThread 주소가 들어갔는가?)
3. 쓰레드가 혹시 한번 돌고 그대로 종료되지 않았는가?

인 것 같군요. 각각 디버그 메세지를 띄우거나 디버거를 넣어 확인해 보세요.

Hide_D

2008.12.26
22:53:45
확인 결과
m_pLoadThread = AfxBeginThread(CAutoLoad::CallbackStub,this);
에서 F10 누르는 순간 정지.

CallBackStub의
while(1)에 브포를 걸어두고 있었는데 여기로 넘어오질 않네요.
List of Articles
번호 제목 글쓴이 조회 수 추천 수sort 날짜 최근 수정일
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 155439   2008-08-03 2008-12-16 00:03
104 Talk [질문] 번역플러그인에 관해... [2] 호기심맨 12729   2009-01-06 2009-01-06 09:12
Aral을 하다보면 한번 번역된 문장은 다시 번역하지 않고 예전에 번역된 결과값을 다시 쓰잖아요.... 궁금한건 이부분을 Aral본체가 하는것인지.... 아니면... 번역플러그인이 해주는 것인지이거든요.. 그러니까 번역플러그인을 만들려면.... 저 처리를 번역플...  
103 Talk ezTransXP의 다이얼로그 파일의 h,cpp가 누락되어있습니다. [1] Hide_D 12415   2009-01-10 2009-01-12 21:37
커밋하시면서 빼놓으신것 같네요;; ezTransXP 쪽도 수정할게 좀 있어서 저부분 마저 올려주세요~  
102 Talk 코드정리 목록 + 코드 secret sizukana 6   2009-01-17 2009-01-17 11:41
비밀글입니다.  
101 Talk 버그 확인 목록 [4] Hide_D 12347   2009-03-06 2009-03-16 03:09
(확인) CustomDic - 옵션창에서 쓰레드를 중지하지 않았다. CustomScript - 파일이 없는 상태에서 바로가기에 Write 모드가 추가되었을때 에러 KiriKiri - 선택지 출현지 문자열 번역 오류 해결 (확인 필요) FixLine 문자가 아무도 없을때 튕김 -_-? 2Byte 잘 ...  
100 Talk FixLine 기능 추가 [1] Hide_D 11416   2009-03-13 2009-03-13 21:23
rn r 이런식으로 나올때 r이 우선 적용되는 문제를 해결할것 -가능한 방법- 1. Greedy, UnGreedy의 부분적 적용 2. 우선순위 선택 3. 정규식과 맞짱뜨기 4. 어정쩡한 조건문 (r)(n) 이면 둘중 하나 있거나, 둘다 있거나 하면 그렇게 지정되는걸로 - 류제로님의...  
99 Talk 번역 플러그인 난해한 문제???? [3] 호기 14864   2009-03-15 2009-10-20 18:06
지금 ML_Trans라는 번역 플러그인을 만들고 있는데 좀 이해가 안가는 문제가 생기네요.. 아랄에 적용시킨후 다른 번역 플러그인으로 바꿀때는 아무 문제가 안생깁니다 그러니까 번역 플러그인을 EzTransXp<->ML_Trans로 마구 여러번 바꾸어도 문제는 안일어 납...  
98 Talk 히데님이 부탁하신거.... [1] file 류제로 19458   2009-03-21 2011-06-28 01:25
 
97 Talk FixLine '인수 추가' 창 새 디자인 [4] file Hide_D 18340   2009-03-26 2009-03-27 02:07
 
96 Talk 아나 ㅅㅂ VS2008 안쓸랍니다. [5] Hide_D 12867   2009-04-02 2009-04-03 21:16
제컴이 ㅄ인지 설치할때 ㅄ이 된건진 잘 모르겠는데, 쓰기 갑갑해 미치겠습니다ㅣ -_-; Visual Studio 2008 SP1입니다. 자주 발생하는 현상이 예를 들어 int j=0; for(int i=0;i<28;i++) { j+=i; } for(int i=0;i<28;i++) { j+=i; } _wsprintf(L"%d",j); 요런 ...  
95 Talk 참 오묘한 윈도우~ 호기 13568   2009-04-04 2009-04-04 01:02
실수로.... malloc으로 잡은걸 HeapFree 하고 있었네요... (머 정확히 말자면 HeapCreate로 새 힙영역 확보하고 할당 해제 하는걸 구축했습니다만.... 정작 할당부분에서 malloc을썼던거죠) 문제는 이렇게 잘못짠걸 1개월이나 지난후에 알았다는 겁니다. 즉 그...  
94 Talk AralTrans 필터 물갈이할 예정입니다.... [1] Hide_D 14725   2009-05-21 2009-05-22 01:55
일단 제가 방학을 시작하기도 했고 하니 아랄트랜스 내에서 제가 제작한 필터를 싹 물갈이해볼 생각입니다. 우선 물갈이 대상 CustomDic 0.4 KDC CustomScript v2 DumpText v2 FixLine v3 작업을 위해서 다음과 같은 라이브러리를 만들어서 걍 복붙 시전할 계...  
93 Talk 한글 조사 처리 [1] Hide_D 12783   2009-05-23 2009-07-08 22:03
기본적으로 맨 마지막 글자를 보고 받침이 붙느냐 안붙느냐를 처리하게 되는데, 일단 쓰여있는 방법은 http://winp.egloos.com/1917711 http://ttongfly.net/zbxe/?document_srl=45333 걍 맨 뒷글자를 일일히 확인하는 방법이다. 그런데 뒤에 있는 문서의 글자...  
92 Talk 정식 아랄 플러그인으로 요청하시고 싶다면 Hide_D 14234   2009-07-10 2009-07-10 18:29
원칙적으로는 관리자님께 요청하는 것이 맞지만 관리자님은 유니크 몹이시기 때문에[...] 절 부르시면 소환해 드립니다. 원클릭 서비스도 가능할지도[..]  
91 Talk FixLine v2 길이제한 '원문 길이' 버그 Hide_D 12853   2009-07-27 2009-07-27 23:05
긴경우는 잘 동작합니다만, 원문 보다 짧은경우에는 그냥 짧은 상태로 유지가 되어서 덮어쓰기 사용시 몇가지 문제가 발생했습니다. 이건은 조만간 빈칸을 채우던가 해서 해결해야겠습니다. + 이 기능은 CmdFilter의 '원문 덮어쓰기'와 같은 기능입니다.  
90 Talk [소스] ConsoleTrans + 질문 [1] file Hide_D 13002   2009-08-11 2009-08-12 23:34
 
89 Talk QuickTrans2 자료 백업 file Hide_D 13246   2009-08-26 2009-08-26 02:53
 
88 Talk [질문] Http POST전송에 대한 이것저것 [3] 호기 24751   2009-09-22 2009-09-23 08:00
에고 Hide_D님과 HaruKaze님덕에 어찌어찌 POST전송을 할수 있게 되었네요 . 다시한번 두분께 너무 감사드리고요.. 전송해서 결과는 받는것은 되지만... 내용에 궁금한것이 두가지 있어서요 이렇게 다시 질문 올립니다. 우선 POST로 Header를 전송할때 말이에...  
87 Talk 튕기는 문제에 대해서 [6] Hide_D 13286   2009-11-26 2009-12-15 02:55
뭐 다들 아시다시피(?) 대부분의 문제는 보안툴이나 백신에 대해선 충돌하기 때문인데, 여태까지는 소극적으로 대응해왔는데 이젠 좀 적극적으로 뭐가 문제인지를 찾아봐야겠습니다. 해서 다음을 조사해서 보고서를 작성하는 프로그램을 만들어볼 예정입니다~ ...  
86 Talk 고칠거? [10] Hide_D 13651   2009-11-28 2009-12-17 18:13
아랄 처음 켰을때 프로세스 먼져 보이는거 아랄만 아랄로 프로세스에 안뜬다는거. by 피시 제 덧[..] 이지트랜스 경로 지정하면 앞으론 고정해봅시다 ㅇㅇ  
85 Talk Windows7에서 0.3 현재시점으로 안돌아갑니다.ㅜ [6] Hide_D 14656   2009-12-04 2009-12-09 23:27
이유가 뭘까요