Как отслеживать QThread

Я работаю над приложением Qt. Там я хотел бы, чтобы рабочий поток выполнял некоторые действия в фоновом режиме, и я хотел бы, чтобы основной поток управлял им, перезапускал рабочий поток, если он по какой-то причине умирает. Я видел сигнал finished (), испускаемый потоком, поэтому, думаю, я мог бы подключить к нему слот.

Это рекомендуемый способ? Если нет, то как я могу этого добиться?

Если я использую сигнал finished (), как я могу узнать разницу между нормальным завершением работы и ошибкой?

Спасибо и привет


person RuLoViC    schedule 01.11.2018    source источник


Ответы (1)


Если вы хотите узнать, была ли у вас ошибка или процесс завершен, просто создайте два сигнала, а не один, и два слота, а не один.

В документации Qt у вас есть пример с подключением для обработки результат:

connect(workerThread, &WorkerThread::resultReady, this, &MyObject::handleResults);

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

connect(workerThread, &WorkerThread::errorThrown, this, &MyObject::handleErrors);

Конечно, другой вариант - просто передать параметр с вашими сигналами / слотами. Это вызов функции, и если вы добавите enum для статуса или int, то подойдет.

person The Quantum Physicist    schedule 01.11.2018
comment
Но как я могу узнать, есть ли в потоке ошибка и он умирает? он излучает сигнал или что-то подобное? - person RuLoViC; 12.11.2018
comment
@RuLoViC Я не знаю ничего, что могло бы убить поток, не уничтожив всю вашу программу. Что касается исключений, вы должны обрабатывать их в своем потоке и передавать их основному потоку. Есть много способов сделать это, например std::promise. Я думаю, что Qt также имеет свою собственную реализацию обещания и будущего. То, что я упомянул в ответе, также должно работать. - person The Quantum Physicist; 12.11.2018