这似乎为每个文件创建了 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 将消息发布回主线程并让它设置进度条。这样一来,您的线程就不会阻塞并等待主线程代表他们与进度条对话。