2010-04-27 109 views
2

在我的应用程序中,我有一个简单的模块,我将读取某些进程的文件,这将需要 几秒钟..所以我想在进程中显示进度条(使用工作线程)。我创建了一个线程(下面显示的代码),我也设计了一个对话框窗口进度control.I使用下面的函数MyThreadFunction来显示进度条,但它只显示一次,消失,我不知道如何使它的工作。我试了我的尽管我是线程新手,但最好能帮助我。如何在win32中使用线程功能显示进度条?

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

克里斯,我没有得到那个点“阻止行为”,你能告诉我它是什么吗?如果你给我一个例子,这将是伟大的! – kiddo 2010-04-27 11:15:38

+0

“阻止行为”是指读取文件操作阻止UI线程正常处理消息的事实。 – 2010-04-27 19:30:37

相关问题