Проблема в отображении сообщения и прогресса одновременно, многопоточность в MFC? - PullRequest
0 голосов
/ 02 марта 2010

Я работаю над многопоточностью в MFC. Я не уверен, как использовать многопоточность. Я не могу получить то, что я исключил! Что я на самом деле пытался, так это прочитать каталог и отобразить имена файлов и в то же время, элемент управления должен отображать прогресс. Я создал динамическую статическую переменную для отображения имен файлов и элемент управления для отображения прогресса ... Здесь происходит следующее: сначала отображаются все имена файлов по одному, а затем после показывая прогресс ... так, я немного запутался .. кто-нибудь может объяснить мне, как это сделать, или дать мне несколько статей ... если вы хотите, я могу опубликовать код

1 Ответ

1 голос
/ 02 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...