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

发布于 2024-08-31 03:26:04 字数 1417 浏览 2 评论 0原文

在我的应用程序中,我有一个简单的模块,我将读取某些过程的文件,该过程将需要 几秒钟..所以我想在文件处理过程中显示进度条(使用工作线程)。我创建了一个线程(代码如下所示),并且还设计了一个带有进度控制的对话框窗口。我使用了函数 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;


}

In my application I have a simple module were I will read files for some process that will take
few seconds..so I thought of displaying a progress bar(using worker thread) while the files are in progress.I have created a thread (code shown below) and also I designed a dialog window with progress control.I used the function MyThreadFunction below to display the progressbar but it just shows only one time and disappears,I am not sure how to make it work.I tried my best inspite of the fact that I am new to threading.Please help me with this friends.

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;


}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

枯叶蝶 2024-09-07 03:26:04

扭转局面,将阻塞行为放入工作线程中。

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

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

Turn it around and put the blocking behavior in the worker thread.

Its a common mistake, but its really NOT worth creating multiple GUI threads in a single process.

Window messages are posted to thread queues :- which means that, at some point, a child, or popup window, is going to try and communicate with a blocked window on another thread. Even if its something the user does unexpectedly like trying to resize or just move the popup window - Which then means that both windows are again blocked on the time consuming process to complete.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文