Для выполнение определённой задачи пришлось прибегнуть к созданию дополнительного потока. Новый поток я создаю в оконном приложении.
Д. Рихтер рекомендует использовать функции _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)
, то как иначе следует дожидаться завершения работы потока с целью закрытия его хендла без подвешивания основной программы?
Складывается впечатление, что вам хэндл потока вообще не нужен, а вы хотите просто его закрыть. Если это так, то вы можете вызывать WaitForSingleObject
непосредственно перед выходом из программы. Или можете его вообще не закрывать - все незакрытые хэндлы при завершении программы закрываются системой.
Или даже использовать _beginthread
. Оттого, что Рихтер не рекомендует ее использовать, совершенно не следует, что эта функция порченая и плохо работает. Рихтер в своей книге обосновал почему он ее не советует - давайте посмотрим чем же эта функция ему не приглянулась.
_beginthread
не позволяет задать для потока отдельный дескриптор защиты. Даже не буду спрашивать нужно ли вам это.
_beginthread
не позволяет создать поток в неактивном (suspended) состоянии. Вы это используете?
_beginthread
автоматически закрывает хэндл потока по завершении функции потока. Возможно, это как раз то, что вам нужно?
В-общем, стоит критически относиться к рекомендациям авторитетов. Многие из них ни на чем не основаны, а отражают личные предпочтения и фобии этих самых авторитетов. Говоря конкретно о _beginthread
- она ничем не хуже _beginthreadex
, просто работает чуть-чуть по-другому. В некоторых случаях удобнее она, в некоторых - _beginthreadex
. Нужно просто понимать их особенности и применимость в каждом конкретном случае.
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Создал проект Desctop-калькулятор, написал код, ошибок при компиляции не выдает, из qtcreator запускается, работает нормальноКогда запускаю файл...
Задача состоит в том, что бы программа принимала строку, и по отдельности выводила в разные строки её буквы(абвгд и тд), цифры(1234) и спец символы(*,/,+,-...
У меня есть два процесса Client и Server, один из них генерирует Bitmap мне нужно его передать другому процессуЯ создал между ними FileMapping
Не могу разобраться в том, как работает drag & drop в qt-ишной model-viewМне нужно реализовать перетаскивание между двумя view (QTreeView) в которых находятся...