2010-03-02 20 views
0

我正在使用线程在MFC中..我不知道如何使用线程..我不能达到我的例外!我实际上尝试的是读取目录并显示文件名,同时,进度控制应该显示进度..我创建了一个动态静态显示文件名和进度条控制来显示进度......这里发生的是,它的第一个显示所有文件名一个接一个,然后显示进度......所以,有点困惑......任何人都可以解释我该怎么做,或者参考我的一些文章......如果你想我可以发布代码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,&findData));循环中,并且没有泵送消息。所以这些线程都要等到循环结束并且主线程返回到消息泵。

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

对于这个工作,你需要将FindNextFile循环进入一个线程,你需要让主线程返回到泵,使得该UI可以在事情的进展进行更新。

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

+0

感谢您的回复...现在我理解了这个概念。谢谢解释...在读完你之后,我去了下面的链接.. http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id = 435 如果你可以把我的一些其他相关的线程文章,它会gr8 ...... – kiddo 2010-03-02 05:53:41

相关问题