2013-03-27 5 views
1

В моей программе он запускает ускоряющую нить и удерживает обработчик в качестве элемента основного потока. Когда пользователь нажимает кнопку «Отмена», мне нужно проверить, что запущенный поток все еще запущен, и если он работает, нужно уничтожить этот конкретный поток. вот псевдокод.Как проверить, что поток boost работает, и убейте его

жульничество нить

int i =1; 
boost::thread m_uploadThread = boost::thread(uploadFileThread,i); 

Это использование метод, чтобы проверить, если нить все еще работает, , но он не работает

boost::posix_time::time_duration timeout = boost::posix_time::milliseconds(2); 
if (this->uploadThread.timed_join(timeout)){ 
//Here it should kill the thread 
} 
+0

что эта нить делает? –

+2

Никогда не убивайте свои нити, обходите их вместе. –

+0

Никогда не убивайте свои потоки, обходите их совместно. (этот комментарий требовал некоторого параллелизма) – Yakk

ответ

4

Возвращаемое значение истинной означает, что поток завершается до вызов истекает. И похоже, что вы хотите

if(!this->uploadThread.timed_join(timeout)) 
+0

Спасибо за точку +1. У вас есть идея, как закончить поток, если все еще выполняется? –

+0

Как правило, вы не убиваете нить, но уведомляете ее, чтобы закончить ее жизнь. Я согласен с Якком в верхнем комментарии. – Shawnone

+0

Я хочу посмотреть, работает ли поток, поэтому я не пытаюсь запустить второй, и я не хочу, чтобы вокруг меня зависала переменная. Вы могли бы подумать, что api обнаружил бы, если boost :: thread is not-a-thread ... – PatchyFog

2

Для остановить поток, вы можете использовать:

my_thread.interrupt(); 

для того, чтобы это работало, вы должны установить interruption point в точке, где вы хотите, функция потока прекращается, когда вы прерываете.

Примечание: прерывание по нему само по себе не останавливает поток, он просто устанавливает флаг, а когда достигается точка прерывания, поток прерывается. Если точка прерывания не найдена, поток не останавливается.

Вы также можете обрабатывать прерванное исключение boost::thread_interrupted таким образом, что вы можете делать что-то в зависимости от того, был ли поток прерван или нет.

Например предположим следующий код внутри функции потока:

try 
{ 
    //... some important code here 
    boost::this_thread.interruption_poit(); // Setting interrutption point. 
} 
catch(boost::thread_interrupted&) 
{ 
    // Now you do what ever you want to do when 
    // the thread is interrupted. 
}