如何在win32中使用线程功能显示进度条?

时间:2010-04-27 10:26:20

标签: winapi multithreading progress-bar

在我的应用程序中,我有一个简单的模块,我会读取一些过程的文件 几秒钟..所以我想在文件正在进行时显示一个进度条(使用工作线程)。我创建了一个线程(下面显示的代码),我还设计了一个带进度控制的对话窗口。我使用了函数MyThreadFunction下面显示进度条,但它只显示一次并消失,我不知道如何使它工作。尽管我是线程新手,我尽力了。请帮助我这个朋友。

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 个答案:

答案 0 :(得分:1)

将其转过来并将阻止行为放在工作线程中。

这是一个常见的错误,但它真的不值得在一个进程中创建多个GUI线程。

窗口消息被发布到线程队列: - 这意味着,在某些时候,子窗口或弹出窗口将尝试与另一个线程上的被阻止窗口进行通信。即使用户意外地尝试调整大小或只是移动弹出窗口,这意味着两个窗口在耗时的过程中再次被阻止完成。