在 MFC 中同时显示消息和进度时出现问题?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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 将消息发布回主线程并让它设置进度条。这样一来,您的线程就不会阻塞并等待主线程代表他们与进度条对话。

【讨论】:

感谢您的回复...现在我理解了这个概念。感谢您的解释...在阅读了您的内容后,我转到了以下链接..devhood.com/tutorials/tutorial_details.aspx?tutorial_id=435 如果您可以向我推荐一些与线程相关的其他文章应该是 gr8……

以上是关于在 MFC 中同时显示消息和进度时出现问题?的主要内容,如果未能解决你的问题,请参考以下文章

在 MFC 中同时挂起 2 个线程的问题!

突出显示文本时出现的弹出消息

使用 MFC 在 MS Visual C++ 2008 中处理 .bmp 图像时出现颜色问题

在 Windows Server 2003 中注册 dll 时出现问题

使用 json 字符串显示 toast 消息时出现问题

MFC:在工作线程中使用对象的成员函数时出现访问冲突错误