2013-06-16 3 views
0

мне нужно выполнить "Выполнить" в отдельном потокеподталкивание нить и класс

class TcpClient 
{ 
public: 
    TcpClient(); 
    virtual ~TcpClient(); 

    void Run(); 
} 

я запустить его с помощью наддува:

MessageBox(0, "1", APP_NAME, NULL); 
    TcpClient client; 
    boost::thread thread(boost::bind(&TcpClient::Run, &client)); 
    thread.join(); 
    MessageBox(0, "2", APP_NAME, NULL); 

метод Run:

void TcpClient::Run() 
{ 
    boost::this_thread::sleep(boost::posix_time::milliseconds(10000)); //Sleep 10 sec 
} 

Messageboks2 должны вызывать сразу после первого, но я должен ждать 10 секунд. Где может быть ошибка?

+0

Это не проблема, но вам не нужна 'bind' здесь; конструктор 'thread' имеет встроенный механизм, поэтому все, что вам нужно, это' std :: thread thr (& TcpClient :: Run и клиент); ' –

ответ

2

Это потому, что вы вызываете join в теме сразу же после ее создания. Он блокируется до тех пор, пока поток не будет выполнен.

Либо не вызывайте join (это будет сделано деструктором, когда переменная выходит за рамки), либо detach нить.


Как отметил Pete Becker, деструктор будет не присоединиться нить, вместо этого он будет вызывать terminate который завершает весь процесс. Чтобы гарантировать, что join вызывается в потоке Boost, используйте класс thread_joiner.

+1

В C++ 11, если вы не называете' join' и вы не называете 'detach', деструктор будет называть' terminate'. Я полагаю, что Boost делает то же самое. Была ранняя спецификация, в которой деструктор назывался 'join', но это было изменено. –

+0

@PeteBecker Вы правы. И даже версия 1 потока Boost фактически не присоединилась к потоку, а просто отделила его. –