Завершение потока C ++ с окном ожидания - PullRequest
1 голос
/ 01 июля 2011

Итак, код выглядит примерно так:

MAIN(){
/*waiting window class declaration*/
    threadinfo* oThread=new threadinfo(); //An object that will help me know when to finish the thread
    QueueUserWorkItem((LPTHREAD_START_ROUTINE)waitingWindow, (void*)mThread, WT_EXECUTELONGFUNCTION);
    function_that_takes_time();
    oThread->setTerminated(); //set member terminated to bool true
/*continue with other things*/
}

и функция waitWindow, которая будет работать в этом потоке

MSG msg;
hwndWaiting=CreateWindow(...) // here the window is created
while (msg.message != WM_QUIT)
    {
        if (PeekMessage(&msg, null, 0U, 0U, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            if(oThread->isTerminated()) // isTerminated returns bool true if terminated
            {
                delete oThread;
                ExitThread(0);
            }
        }
    }
ExitThread(0);

Является ли ExitThread хорошим способом удаления окна ожидания,и безопасно удалить нить?(по крайней мере, я 100% уверен, , когда закончу).

Я спрашиваю это, потому что это хорошо работает в Windows XP, но завершится с "приложениемперестал работать "на Windows 7.

Спасибо за помощь.

Ответы [ 2 ]

3 голосов
/ 01 июля 2011

Лучший способ закончить потоки в целом, это дать им "изящно" закончить самостоятельно.Вы можете указать потоку завершиться, установив событие, например:

HANDLE hevent_die = CreateEvent(...);  
HANDLE hthread_something = CreateThread(...); // or _beginthread()
...

DWORD WINAPI thread_func (LPVOID param)
{
  while(working && WaitForSingleObject(hevent_die, 0)!=WAIT_OBJECT_0)
  {
    ...
  }

  return 0;
}


while (msg.message != WM_QUIT)
{
   ...

   if(WaitForSingleObject(hthread_something, 0) == WAIT_OBJECT_0)
   {
     // do things if needed
   }
}

SetEvent(hevent_die);
WaitForSingleObject(hthread_something, INFINITE);

CloseHandle(hthread_something);
CloseHandle(hevent_die);
hthread_something = 0;
hevent_die = 0;

Если вы используете вложенные циклы внутри функции потока, они тоже должны завершиться, если получат событие.

3 голосов
/ 01 июля 2011

Вы должны выйти из вашего цикла и аккуратно, чтобы все деструкторы были вызваны правильно.Не используйте ExitThread (), просто используйте флаг, чтобы указать, когда выйти из цикла, а затем просто выйдите из функции waitWindow в конце.

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