페이지

2010년 3월 22일 월요일

[두루에디트 제작기] 쓰레드 검색처리시 입력장치공유

메인창 메인프로세스 쓰레드와는 별도로 생성하여 돌리는 검색쓰레드 내부이다.
쓰레드는 윈도우를 생성한 메인쓰레드의 키보드나 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;
}

댓글 없음:

댓글 쓰기