2016-12-02 7 views
0

Я использовал boost :: asio :: deadline_timer для запуска функции. У меня есть MosquitoInterface класс как следоватьИспользование boost :: asio :: deadline_timer внутри потока

class MosquitoInterface{ 

    MosquitoInterface(deadline_timer &timer) : t(timer){} 

} 

Внутри моего main.c

int main(int argc, char** argv) 
{  

    io_service io; 
    deadline_timer t(io); 
    MosquitoInterface *m = new MosquitoInterface(t); 


    io.run(); 

    d = new Detectdirection();  
    while(run) 
    { 

     int ret = d->Tracking(); 
     if(ret < 0) 
      cout << "Pattern is not found" << endl ; 
    } 

    if(d!=NULL)  
     delete d; 
    if(m!=NULL) 
     delete m; 
    cout << "Process Exit" << endl; 
    exit(1); 
} 

Если я бегу io.run(); до while(run){ }, while(run){ } не работает. Если я положил io.run() после while(run){ }, таймер не работает. Поскольку они находятся в главной теме.

Как запустить boost :: asio :: deadline_timer внутри потока, чтобы не было блокировки цикла while.

ответ

1

Просто запустите io_service в отдельной теме. Обязательно отправьте работу (например, async_wait) до этого момента, потому что в противном случае run() будет немедленно возвращаться.

Live On Coliru

Примечание зачистка (удаление всех ненужных new и delete беспорядок). Также это как вы создаете SSCCE:

#include <boost/asio.hpp> 
#include <thread> 
#include <iostream> 
#include <atomic> 

static std::atomic_bool s_runflag(true); 

struct Detectdirection { 
    int Tracking() const { return rand()%10 - 1; } 
}; 

struct MosquitoInterface{ 
    MosquitoInterface(boost::asio::deadline_timer &timer) : t(timer) { 
     t.async_wait([](boost::system::error_code ec) { if (!ec) s_runflag = false; }); 
    } 
    boost::asio::deadline_timer& t; 
}; 

int main() { 
    boost::asio::io_service io; 
    boost::asio::deadline_timer t(io, boost::posix_time::seconds(3)); 

    MosquitoInterface m(t); 
    std::thread th([&]{ io.run(); }); 

    Detectdirection d; 
    while (s_runflag) { 
     if (d.Tracking()<0) { 
      std::cout << "Pattern is not found" << std::endl; 
     } 
     std::this_thread::sleep_for(std::chrono::milliseconds(500)); 
    } 

    th.join(); 
    std::cout << "Process Exit" << std::endl; 
} 
Смежные вопросы