Недавно, я сталкиваюсь с этой проблемой, как я упомянул в этом Заголовке. Я попробовал при помощи QThread:: оконечный (), но я просто НЕ могу остановить поток, который находится в мертвом цикле (скажем, в то время как (1)).
большое спасибо.
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.
Вызвал ли поток QThread :: setTerminationEnabled (false)
? Это приведет к тому, что завершение потока будет отложено на неопределенный срок.
РЕДАКТИРОВАТЬ: Я не знаю, на какой платформе вы работаете, но я проверил реализацию QThread :: terminate в Windows. Предполагая, что поток действительно был запущен с самого начала, и его завершение не было отключено с помощью указанной выше функции, это, по сути, оболочка вокруг TerminateThread ()
в Windows API. Эта функция не принимает неуважение ни к одному потоку и имеет тенденцию оставлять за собой беспорядок с утечками ресурсов и подобным "зависшим" состоянием. Если это не убивает поток, вы либо имеете дело с вызовами зомби-ядра (скорее всего, заблокированный ввод-вывод), либо где-то у вас есть еще более серьезные проблемы.
]Для использования неназванных труб[
] [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, которые добавляли сложности, и отладка была кошмаром. Использование труб избавило меня от этих сложностей, кроме того, что упростило код. Я не говорю, что это лучший вариант, но в моем случае он оказался лучшей и самой чистой альтернативой. До этого решения я прослушивал свое зависшее приложение. [
]