2010-04-27 2 views
2

내 응용 프로그램에서 나는 간단한 모듈을 가지고 있는데 어떤 프로세스를 위해 파일을 읽을 것인가? 몇 초 ... 파일이 진행되는 동안 진행 막대 (작업자 스레드 사용)를 표시한다고 생각했습니다. 스레드 (코드 아래에 표시) 및 또한 진행률 컨트롤이있는 대화 창을 디자인했습니다. 나는 아래에있는 MyThreadFunction을 사용하여 progressbar 표시하지만 한 번만 보여 사라집니다, 나는 그것을 작동하게하는 방법을 잘 모르겠습니다. 내가 스레딩을 처음 접하는 것이 가장 좋습니다.이 친구들을 도와주세요.win32에서 스레딩 기능을 사용하여 progressbar를 표시하는 방법은 무엇입니까?

reading files 
void ReadMyFiles() 
{ 

    for(int i = 0; i < fileCount ; fileCount++) 
    { 
    CWinThread* myThread = AfxBeginThread((AFX_THREADPROC)MyThreadFunction,NULL); 
    tempState = *(checkState + index); 
    if(tempCheckState == NOCHECKBOX) 
    { 
     //my operations 
    } 
    else//CHECKED or UNCHECKED 
    { 
     //myoperation 
    } 
    myThread->PostThreadMessage(WM_QUIT,NULL,NULL); 
    } 
} 

thread functions 
UINT MyThreadFunction(LPARAM lparam) 
{ 
    HWND dialogWnd = CreateWindowEx(0,WC_DIALOG,L"Proccessing...",WS_OVERLAPPEDWINDOW|WS_VISIBLE, 
        600,300,280,120,NULL,NULL,NULL,NULL); 
    HWND pBarWnd = CreateWindowEx(NULL,PROGRESS_CLASS,NULL,WS_CHILD|WS_VISIBLE|PBS_MARQUEE,40,20,200,20, 
          dialogWnd,(HMENU)IDD_PROGRESS,NULL,NULL); 

    MSG msg; 

    PostMessage(pBarWnd, PBM_SETRANGE, 0, MAKELPARAM(0, 100)); 
    PostMessage(pBarWnd,PBM_SETPOS,0,0); 
    while(PeekMessage(&msg,NULL,NULL,NULL,PM_NOREMOVE)) 
    { 
     if(msg.message == WM_QUIT) 
     { 
      DestroyWindow(dialogWnd); 
      return 1; 
     } 
     AfxGetThread()->PumpMessage(); 
     Sleep(40); 
    } 
    return 1; 


} 

답변

1

주위를 돌리고 작업자 스레드에 차단 동작을 넣습니다.

일반적인 실수이지만, 하나의 프로세스에서 여러 GUI 스레드를 만들 가치가 없습니다.

창 메시지는 스레드 대기열에 게시됩니다. 즉, 어떤 시점에서 자식 또는 팝업 창이 다른 스레드에서 차단 된 창과 통신하려고 시도합니다. 사용자가 예기치 않게 크기를 조정하거나 팝업 창을 이동하는 것과 같은 예기치 못한 경우에도 - 두 창 모두 시간이 많이 소요되는 프로세스에서 다시 차단된다는 것을 의미합니다.

+0

Chris, 나는 그 점을 이해하지 못했습니다. "행동 차단", 그것이 무엇인지 말해 줄 수 있습니까? 예를 보여 주면 좋을 것입니다! – kiddo

+0

"차단 동작"은 파일 읽기 작업이 정상적인 메시지 처리에서 UI 스레드를 차단한다는 사실을 나타냅니다. –

관련 문제