在 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 个线程尝试使用 SetRange
或 GetPos
或 StepIt
时,它们实际上是在向主线程发送消息以告诉它执行这些操作。
同时主线程在do while(FindNextFileW(handle,&findData));
循环中,并且没有发送消息。所以这些线程都等到循环完成并且主线程返回到它的消息泵。
然后你的每个线程都会唤醒并从调用SetRange
等返回。但一次只有一个,因为一次只能处理消息。
为此,您需要将FindNextFile
循环移动到一个线程中,并且您需要让主线程返回泵,以便在事情进行时更新 UI。
您还需要停止尝试直接从任何非主线程设置进度条。而是使用 PostMessage 将消息发布回主线程并让它设置进度条。这样一来,您的线程就不会阻塞并等待主线程代表他们与进度条对话。
【讨论】:
感谢您的回复...现在我理解了这个概念。感谢您的解释...在阅读了您的内容后,我转到了以下链接..devhood.com/tutorials/tutorial_details.aspx?tutorial_id=435 如果您可以向我推荐一些与线程相关的其他文章应该是 gr8……以上是关于在 MFC 中同时显示消息和进度时出现问题?的主要内容,如果未能解决你的问题,请参考以下文章
使用 MFC 在 MS Visual C++ 2008 中处理 .bmp 图像时出现颜色问题