Там не было никакого прямого и удовлетворительный ответ нашел на довольно простой вопрос:Ожидание нитей закончить в то время как выход из процесса
Учитывая несколько потоков, выполняющихся существует ли общий/правильный способ ждать на них, чтобы закончить при выходе процесс? Или «делает приуроченное ожидание. Хорошо в этом случае?»
Да, мы пытаемся сигнализировать о завершении резьбы, но наблюдается, что во время выхода процесса некоторые из них склонны к остановке. Недавно мы имели обсуждение и было принято решение избавиться от «произвольного ожидания»:
m_thread.quit(); // the way we had threads finished
m_thread.wait(kWaitMs); // with some significant expiration (~1000ms)
m_thread.quit(); // the way we have threads finished now
m_thread.wait(); // wait forever until finished
Я понимаю, что постоянная kWaitMs следует выбирать несколько пропорционально одной непрерывной «работы цикла» для потока, чтобы закончить. Скажем, если поток обрабатывает некоторый фрагмент данных за 10 мс, то нам, вероятно, следует подождать, пока он ответит на сигнал выхода за 100 мс, и если он все равно не уйдет, мы просто больше не будем ждать. Мы не будем ждать в этом случае, пока мы выходим из программы и больше не заботимся. Но некоторые инженеры не понимают такую «парадигму» и хотят окончательного ожидания. Имейте в виду, что программный процесс, застрявший в памяти на клиентском компьютере, вызовет проблемы при запуске следующей программы в нашем случае, не говоря уже о том, что журнал не будет правильно завершен для обработки в качестве ошибки.
Можно ли ответить на вопрос о правильной обработке резьбы при завершении процесса?
Есть ли какая-то помощь от Qt/APIs, чтобы лучше разрешить зависание нити, поэтому мы можем записать причину этого?
P.S. Имейте в виду, что я well aware о том, почему это неправильно, чтобы принудительно завершить поток и как это можно сделать. Этот вопрос, я думаю, касается не синхронизации, а ограниченного детерминизма потоков, которые управляют тоннами нашего и фреймворка и кода ОС. ОС не в режиме реального времени, право: Windows/MacOS/Linux и т. Д.
P.P.S. Все эти темы имеют цикл событий, поэтому должен ответить на QThread::quit()
.
Итак, вы спрашиваете, как убедиться, что поток правильно отвечает на событие «выйти»?Или вы спрашиваете, как определить, почему поток не ушел правильно? Я не уверен, что понимаю, что вы подразумеваете под «ограниченным детерминизмом». Вы имеете в виду «Удостовериться, что он не может работать очень долго»? –
Главный вопрос: выполняется ли время ожидания Ok в этом случае? И все связанное обсуждение, включая диагностику, почему он не уходит. – AlexanderVX