출처:본인(http://krkim.net)의 폭파당한 예전 블로그(http://blog.hanafos.com/yeamaec) 캐시에서 가져옴.
메인창 메인프로세스 쓰레드와는 별도로 생성하여 돌리는 검색쓰레드 내부이다.
쓰레드는 윈도우를 생성한 메인쓰레드의 키보드나 Focus정보를 공유못하도록되어있다.
GetFocus등이 null이 리턴된다. 아래는 공유하는 코드이다.
DWORD DEFinder::FindAllProc(LPVOID pParam)
{
BOOL flag = FALSE;
DEFinder *pRoot = reinterpret_cast (pParam);
DEMainWnd *pMainWnd = (DEMainWnd *)KFCGetMainWnd();
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
pRoot->m_threadreqcnt = 1;
#ifdef DE_USE_THREADSAFE_GETFOCUS_INPUT
//쓰레드로 돌릴때 GetFocus등이 NULL이 리턴된다.쓰레드별로 독립적으로 관리되기 때문에
//GetFocus등이 NULL을 돌려주기 때문에 편집창의 캐럿위치가 제대로 반영이 안된다.
//따라서 쓰레드를 메인프로세스의 쓰레드로 ATTACH하여 메세지큐를 공유하도록 한다.
DWORD dwProcessId = 0;
DWORD dwMainThreadId= GetWindowThreadProcessId(pMainWnd->GetSafeHwnd(),&dwProcessId);
DWORD dwMyThreadId = GetCurrentThreadId();
BOOL at = AttachThreadInput(dwMainThreadId,dwMyThreadId,TRUE);
#endif
while(1){
pRoot->m_faparam.bStop = 0;
if(pRoot->m_faparam.which == FW_FIND pRoot->m_faparam.which == FW_REPLACE){
pRoot->FindNext(&pRoot->m_faparam);//매번 처음 검색
}
else
pRoot->FindAll(&pRoot->m_faparam);
if(pRoot->m_faparam.bStop)
TRACELOG("취소됨\n");
pRoot->m_threadreqcnt--;
if(pRoot->m_threadreqcnt <= 0) break; } pRoot->m_hfthread = NULL;
TRACELOG("쓰레드종료\n");
if(pRoot->m_faparam.which != FW_FIND && pRoot->m_faparam.which != FW_REPLACE){
if(pMainWnd->m_wndOutputBar.IsWindow())
ListBox_AddString(pMainWnd->m_wndOutputBar.m_hListBox,"검색 쓰레드 종료");
}
#ifdef DE_USE_THREADSAFE_GETFOCUS_INPUT
at = AttachThreadInput(dwMainThreadId,dwMyThreadId,FALSE);
#endif
return 0;
}
메인창 메인프로세스 쓰레드와는 별도로 생성하여 돌리는 검색쓰레드 내부이다.
쓰레드는 윈도우를 생성한 메인쓰레드의 키보드나 Focus정보를 공유못하도록되어있다.
GetFocus등이 null이 리턴된다. 아래는 공유하는 코드이다.
DWORD DEFinder::FindAllProc(LPVOID pParam)
{
BOOL flag = FALSE;
DEFinder *pRoot = reinterpret_cast
DEMainWnd *pMainWnd = (DEMainWnd *)KFCGetMainWnd();
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
pRoot->m_threadreqcnt = 1;
#ifdef DE_USE_THREADSAFE_GETFOCUS_INPUT
//쓰레드로 돌릴때 GetFocus등이 NULL이 리턴된다.쓰레드별로 독립적으로 관리되기 때문에
//GetFocus등이 NULL을 돌려주기 때문에 편집창의 캐럿위치가 제대로 반영이 안된다.
//따라서 쓰레드를 메인프로세스의 쓰레드로 ATTACH하여 메세지큐를 공유하도록 한다.
DWORD dwProcessId = 0;
DWORD dwMainThreadId= GetWindowThreadProcessId(pMainWnd->GetSafeHwnd(),&dwProcessId);
DWORD dwMyThreadId = GetCurrentThreadId();
BOOL at = AttachThreadInput(dwMainThreadId,dwMyThreadId,TRUE);
#endif
while(1){
pRoot->m_faparam.bStop = 0;
if(pRoot->m_faparam.which == FW_FIND pRoot->m_faparam.which == FW_REPLACE){
pRoot->FindNext(&pRoot->m_faparam);//매번 처음 검색
}
else
pRoot->FindAll(&pRoot->m_faparam);
if(pRoot->m_faparam.bStop)
TRACELOG("취소됨\n");
pRoot->m_threadreqcnt--;
if(pRoot->m_threadreqcnt <= 0) break; } pRoot->m_hfthread = NULL;
TRACELOG("쓰레드종료\n");
if(pRoot->m_faparam.which != FW_FIND && pRoot->m_faparam.which != FW_REPLACE){
if(pMainWnd->m_wndOutputBar.IsWindow())
ListBox_AddString(pMainWnd->m_wndOutputBar.m_hListBox,"검색 쓰레드 종료");
}
#ifdef DE_USE_THREADSAFE_GETFOCUS_INPUT
at = AttachThreadInput(dwMainThreadId,dwMyThreadId,FALSE);
#endif
return 0;
}
'C | C++ | VC++' 카테고리의 다른 글
Visual Leak Detector - vld의 Bug (0) | 2010.07.09 |
---|---|
[두루에디트 제작기] 정규식(Regular Expression) 검색 구현 (0) | 2010.07.09 |
[두루에디트 제작기] WS_VISIBLE 과 SetRedraw와의 관계 (0) | 2010.07.09 |
[KFCWndLib 제작기] 스크롤 윈도우와 인쇄미리보기용 윈도우 클래스 추가 (0) | 2010.07.09 |
메모리누수감지 라이브러리 [Visual C++] (0) | 2010.07.08 |