Похоже, что создается 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
в поток, и вам нужно позволить основному потоку вернуться к насосу, чтобы пользовательский интерфейс мог обновляться в процессе работы.
Вам также необходимо прекратить попытки устанавливать индикатор выполнения непосредственно из любого неосновного потока. Вместо этого используйте PostMessage для отправки сообщений обратно в основную ветку и позвольте ему установить индикатор выполнения. Таким образом, ваши потоки не блокируются и не ждут, пока основной поток за них отзовется с индикатором выполнения.