_beginthreadex - дождаться завершения потока

139
05 октября 2019, 02:40

Для выполнение определённой задачи пришлось прибегнуть к созданию дополнительного потока. Новый поток я создаю в оконном приложении.

Д. Рихтер рекомендует использовать функции _beginthreadex() и _endthreadex()

HANDLE hThread;
unsigned threadID;
hThread = (HANDLE)_beginthreadex(NULL, 0, &ThreadFunc, NULL, 0, &threadID);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);

функция потока:

unsigned __stdcall ThreadFunc(void* pArguments)
{
    while(true)
    {
    //...
    }
_endthreadex(0);
return 0;
}

В результате поток запускается, выполняется его код, а функция WaitForSingleObject ждёт его завершения, чтобы потом закрыть его хендлы.

Проблема в том, что вот эта самая WaitForSingleObject подвешивает само окно. Вопрос: если убрать из кода WaitForSingleObject и CloseHandle(hThread), то как иначе следует дожидаться завершения работы потока с целью закрытия его хендла без подвешивания основной программы?

Answer 1

Складывается впечатление, что вам хэндл потока вообще не нужен, а вы хотите просто его закрыть. Если это так, то вы можете вызывать WaitForSingleObject непосредственно перед выходом из программы. Или можете его вообще не закрывать - все незакрытые хэндлы при завершении программы закрываются системой.

Или даже использовать _beginthread. Оттого, что Рихтер не рекомендует ее использовать, совершенно не следует, что эта функция порченая и плохо работает. Рихтер в своей книге обосновал почему он ее не советует - давайте посмотрим чем же эта функция ему не приглянулась.

  1. _beginthread не позволяет задать для потока отдельный дескриптор защиты. Даже не буду спрашивать нужно ли вам это.

  2. _beginthread не позволяет создать поток в неактивном (suspended) состоянии. Вы это используете?

  3. _beginthread автоматически закрывает хэндл потока по завершении функции потока. Возможно, это как раз то, что вам нужно?

В-общем, стоит критически относиться к рекомендациям авторитетов. Многие из них ни на чем не основаны, а отражают личные предпочтения и фобии этих самых авторитетов. Говоря конкретно о _beginthread - она ничем не хуже _beginthreadex, просто работает чуть-чуть по-другому. В некоторых случаях удобнее она, в некоторых - _beginthreadex. Нужно просто понимать их особенности и применимость в каждом конкретном случае.

READ ALSO
Qt 4.8.2. Как собрать исполняемый файл

Qt 4.8.2. Как собрать исполняемый файл

Создал проект Desctop-калькулятор, написал код, ошибок при компиляции не выдает, из qtcreator запускается, работает нормальноКогда запускаю файл...

138
Отдельный вывод букв, цифр, и спец символов

Отдельный вывод букв, цифр, и спец символов

Задача состоит в том, что бы программа принимала строку, и по отдельности выводила в разные строки её буквы(абвгд и тд), цифры(1234) и спец символы(*,/,+,-...

94
Передача Bitmap между процессами?

Передача Bitmap между процессами?

У меня есть два процесса Client и Server, один из них генерирует Bitmap мне нужно его передать другому процессуЯ создал между ними FileMapping

112
Drag & Drop в QAbstractItemModel

Drag & Drop в QAbstractItemModel

Не могу разобраться в том, как работает drag & drop в qt-ишной model-viewМне нужно реализовать перетаскивание между двумя view (QTreeView) в которых находятся...

126