MFC Threading Issue - программа не завершается после завершения всех потоков - PullRequest
0 голосов
/ 20 февраля 2012

Я создал приложение Single Dialog, которое в основном выполняет серию сложных вычислений. Сначала приложение создавалось как консольное приложение Win32, а затем я решил добавить индикатор выполнения, а затем преобразовал консольное приложение в приложение на основе единого диалога. В диалоге есть индикатор выполнения. в функции диалога OnInitDialog () я начинаю вычисления. Расчеты выполняются в рабочем потоке. Этот поток создается путем вызова функции _beginthreadex. Индикатор выполнения обновляется потоком, публикуя сообщения в диалог с помощью PostMessage. После того как поток завершил выполнение, я вызываю функцию CDialog :: OnOK (), чтобы закрыть диалог. Проблема в том, что даже после закрытия диалога приложение не закрывается сразу. Закрытие приложения занимает около 2 секунд, даже если диалоговое окно закрыто. Любая помощь для решения этой проблемы высоко ценится. Спасибо.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2012

Возможно, рабочий поток все еще работает. Чтобы убедиться, что поток остановлен, используйте события для подачи сигнала. Вы можете сообщить о событии, чтобы убить поток, когда пользователь нажимает кнопку закрытия в диалоговом окне.

Вы можете проверить, сигнализируется ли событие в вашем сложном расчете (может быть цикл), и отказаться от него. Таким образом остановка потока без проблем.

while(true)
{
  //Some complex task

   DWORD dwWaitResult;
   dwWaitResult = WaitForSingleObject(hwndShutdownEvent,0);
   if (WAIT_OBJECT_0 == dwWaitResult)   
   {
        break;                  
   }
}
0 голосов
/ 21 февраля 2012

Это потому, что ваш рабочий поток все еще работает. Приложение не прекратит работу, пока не завершатся все потоки. Поскольку ваш поток пользовательского интерфейса закрывается перед рабочим потоком, окно может быть скрыто, но процесс не завершается, пока рабочий поток не завершил свою работу.

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