在win32应用程序中使用线程显示进度条!

时间:2010-04-27 11:34:38

标签: 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)

真的想为每个文件创建一个新线程和进度条吗?在for()循环之外创建线程。

但这不是正确的做法,你的主用户界面仍然像死亡一样死了。几秒钟后,Windows将在标题栏中以“无响应”方式将主窗口变为幽灵。您希望使用工作线程来执行文件操作,使用主线程来使用对话框显示进度条,该对话框只有在worker使用PostMessage()指示完成时才能关闭。