2015-07-23 2 views
1

Я бы хотел использовать потоки в коммутаторе. Возможно ли это или есть другой способ прервать нить в другом месте программы?boost :: прерывание потока асинхронно

switch (event_element) // dispatch event handler 
{ 
    case 1: // main task thread 
    { 
     boost::thread thr_check_db_task (check_db_task); 
     break; 
    } 
    case 2: 
    { 
     std::cerr << "DATABASE CONNECTION ERROR" << std::endl; 
     thr_check_db_task.interrupt();  // **COMPILE ERROR** 
     mysql_connection_error(); 
     break; 
    } 
    default: 
     break; 
} 

спасибо.

+0

Вы получаете доступ к локальной переменной 'thr-check-db_task' вне пределов области видимости. Вот почему вы получили сообщение об ошибке. Один из способов - сохранить его как переменную-член класса. –

+1

Вы не опубликовали ошибку компилятора, которую вы получаете, поэтому я угадаю, что его что-то вроде строк '' thr_check_db_task' не объявлено в этой области? Если это так, тогда это имеет смысл. 'The_check_db_task' явно не входит в сферу дела 2. – Alejandro

+0

Да, вы оба правы. Как я могу запустить поток и прервать его асинхронно? – xinthose

ответ

1

Я понял это, благодаря this question.

boost::thread thr_check_db_task; 

switch (event_element) // dispatch event handler 
{ 
    case 1: // main task thread 
    { 
     thr_check_db_task = boost::thread (check_db_task); 
     break; 
    } 
    case 2: 
    { 
     std::cerr << "DATABASE CONNECTION ERROR" << std::endl; 
     thr_check_db_task.interrupt(); 
     mysql_connection_error(); 
     break; 
    } 
    default: 
     break; 
} 

Я знал, что ответ был проще, чем создание сложного класса.

1

Что вам нужно сделать, это поместить этот объект потока как переменную-член соответствующего класса, чтобы он мог использоваться совместно с вызовами функций этого класса.

Е.Г.,

#include <boost/thread/thread.hpp> 

class tMyApp 
{ 
    struct callable 
    { 
     void operator()() 
     { 
     // Do something and wait to be interrupted 
     while (true) 
     { 
      /* .. */ 
     } 
     } 
    }; 

public: 
    tMyApp(): m_thread(m_threadProc) 
    { 
     /* do something.. */ 

     m_thread.interrupt(); 
    } 

private: 
    callable m_threadProc; 
    // The thread object 
    boost::thread m_thread; 
}; 
+0

спасибо; как бы я использовал это из int main точно? Мой переключатель находится в int main. – xinthose

+0

Вы можете использовать либо указатель на объект потока, назначенный кучей, либо использовать метод подкачки/перемещения. Вы создаете указатель NULL или объект, построенный по умолчанию, до 'switch'. –

Смежные вопросы