2016-10-01 2 views
1

Моя второстепенная тема прослушивает кролика канала и хочет удалить ее из основного потока, когда я вызываю метод stopListen().C++ Убить ожидания std :: thread

void PFClient::startListen() 
{ 
this->stop = false; 
this-> t = thread(&PFClient::callback,this);  
} 

void PFClient::callback() 
{ 
PFAPIResponse* response; 
char * temp; 
    while (!this->stop) 
    { 
     try 
     { 

      std::string receiver_data = ""; 
      //std::wcout << L"[Callback] oczekiwanie na wiadomość !" << endl; 
      receiver_data = this->channel->BasicConsumeMessage()->Message()->Body(); 
      temp = &receiver_data[0]; 
... some operation with received data 

void PFClient::stopListen() 
{ 
this->stop = true; 
} 

Семафор работает неправильно, потому что он будет работать только после следующего полученного сообщения. Я пытаюсь отсоединить(), завершить(), но не работает. Как я могу жестоко убить этот процесс?

+1

Вы действительно должны избегать его убить (утечки ресурсов и т.д.) – deviantfan

+1

Можете ли вы использовать в * NO- блокировка * получать функция? У каждой приличной библиотеки должна быть функция * block_for * –

+0

@deviantfan Я знаю, но если я хочу, как я могу это сделать? – Jakooop

ответ

1

Как я уже сказал в своем комментарии, вы можете использовать функцию блокировки.

Если библиотека вы используете не обеспечивает его, то async может быть реальной альтернативой:

while (this->stop == false) { 
    auto receiver_data = std::async(/* ... address function and object*/); 

    // wait for the message or until the main thread force the stop 
    while (this->stop == false && 
     (receiver_data.wait_for(std::chrono::milliseconds(1000) == std::future_status::timeout)) 
    ; 

    if (this->stop == false && receiver_data.vaild() == true) { 
    // handle the message 
    } 
} 
+0

THX, я попробую! Это https://github.com/alanxz/SimpleAmqpClient, и это метод синхронизации – Jakooop

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