Как я могу завершить QThread

Недавно, я сталкиваюсь с этой проблемой, как я упомянул в этом Заголовке. Я попробовал при помощи QThread:: оконечный (), но я просто НЕ могу остановить поток, который находится в мертвом цикле (скажем, в то время как (1)).

большое спасибо.

17
задан ChrisV 14 December 2009 в 03:50
поделиться

4 ответа

Terminating the thread is the easy solution to stopping an async operation, but it is usually a bad idea: the thread could be doing a system call or could be in the middle of updating a data structure when it is terminated, which could leave the program or even the OS in an unstable state.

Try to transform your while(1) into while( isAlive() ) and make isAlive() return false when you want the thread to exit.

12
ответ дан 30 November 2019 в 14:25
поделиться

Вы пробовали выйти или выйти ?

0
ответ дан 30 November 2019 в 14:25
поделиться

Вызвал ли поток QThread :: setTerminationEnabled (false) ? Это приведет к тому, что завершение потока будет отложено на неопределенный срок.

РЕДАКТИРОВАТЬ: Я не знаю, на какой платформе вы работаете, но я проверил реализацию QThread :: terminate в Windows. Предполагая, что поток действительно был запущен с самого начала, и его завершение не было отключено с помощью указанной выше функции, это, по сути, оболочка вокруг TerminateThread () в Windows API. Эта функция не принимает неуважение ни к одному потоку и имеет тенденцию оставлять за собой беспорядок с утечками ресурсов и подобным "зависшим" состоянием. Если это не убивает поток, вы либо имеете дело с вызовами зомби-ядра (скорее всего, заблокированный ввод-вывод), либо где-то у вас есть еще более серьезные проблемы.

0
ответ дан 30 November 2019 в 14:25
поделиться
[

]Для использования неназванных труб[

] [
int gPipeFdTest[2];  //create a global integer array
] [

]В случае, если вы собираетесь создать трубы, используйте[

] [
if( pipe(gPipeFdTest) < 0)

{

perror("Pipe failed");

exit(1);

}
] [

]Вышеуказанный код создаст трубу, имеющую два конца gPipeFdTest[0] для чтения и gPipeFdTest[1] для написания. Все, что вы можете сделать, это запустить функцию, настроенную на чтение трубы с помощью системного вызова. А оттуда, откуда вы хотите выйти из выполнения, вы можете настроиться на запись с помощью системного вызова. Я использовал системный вызов select для мониторинга считываемого конца трубы, так как он подходит для моей имплантации. Попробуйте разобраться во всем этом в вашем случае. Если вам нужна еще какая-нибудь помощь, дайте мне знать.[

] [

]Редактирование:[

] [

]Моя проблема была такой же, как и ваша. У меня был определенный(1) цикл, и другие вещи, которые я пробовал, нуждались в мьютексах и других фантастических многопоточных mumbo jumbo, которые добавляли сложности, и отладка была кошмаром. Использование труб избавило меня от этих сложностей, кроме того, что упростило код. Я не говорю, что это лучший вариант, но в моем случае он оказался лучшей и самой чистой альтернативой. До этого решения я прослушивал свое зависшее приложение. [

]
0
ответ дан 30 November 2019 в 14:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: