【问题标题】:Problem in displaying the message and the progress at the same time,threading in MFC?在 MFC 中同时显示消息和进度时出现问题?
【发布时间】:2010-03-02 04:14:43
【问题描述】:

我正在 MFC 中处理线程..我不确定如何使用线程..我无法实现我所例外的!我实际尝试的是读取目录并显示文件名,同时,进度控件应该显示进度..我创建了一个动态静态来显示文件名和进度条控件来显示进度......这里发生的是,它首先一个一个地显示所有文件名,然后再显示它显示进度......所以,我有点困惑......谁能解释我如何做到这一点或给我一些文章......如果你想要我可以发布代码

【问题讨论】:

    标签: mfc multithreading


    【解决方案1】:

    这似乎为每个文件创建了 10 个线程

            for(int i =0;i<10;i++)
            {
                THREADINFOSTRUCT *_param = new THREADINFOSTRUCT;
               _param->_this = this;
                AfxBeginThread(MyThread,_param,THREAD_PRIORITY_ABOVE_NORMAL);
                ....
            }
    

    所有 10 个线程同时尝试设置单个进度条。 (这很糟糕)

    ts->_this->m_ProgressCtrl.SetRange (0, 500);
    while (ts->_this->m_ProgressCtrl.GetPos () < 500)
    {
        Sleep(250);
        ts->_this->m_ProgressCtrl.StepIt ();
    }
    

    我们看不到创建进度条的代码。但它大概属于主线程。因此,当这 10 个线程尝试使用 SetRangeGetPosStepIt 时,它们实际上是在向主线程发送消息以告诉它执行这些操作。

    同时主线程在do {} }while(FindNextFileW(handle,&amp;findData)); 循环中,并且没有发送消息。所以这些线程都等到循环完成并且主线程返回到它的消息泵。

    然后你的每个线程都会唤醒并从调用SetRange 等返回。但一次只有一个,因为一次只能处理消息。

    为此,您需要将FindNextFile 循环移动到一个线程中,并且您需要让主线程返回泵,以便在事情进行时更新 UI。

    您还需要停止尝试直接从任何非主线程设置进度条。而是使用 PostMessage 将消息发布回主线程并让它设置进度条。这样一来,您的线程就不会阻塞并等待主线程代表他们与进度条对话。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 2019-09-09
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    相关资源
    最近更新 更多