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

时间:2010-03-02 04:14:43

标签: mfc multithreading

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

1 个答案:

答案 0 :(得分: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,&findData));循环中,并不是在传递消息。所以那些线程都等到循环结束并且主线程回到它的消息泵。

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

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

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