2016-12-02 125 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){ }不起作用。 如果我在while(run){ }之後放io.run(),定時器不起作用。 因爲它們在主線程中。

如何在一個線程內運行boost :: asio :: deadline_timer,這樣就沒有對while循環的阻塞。

回答

1

只需在單獨的線程上運行io_service。請務必在該點之前發佈工作(如async_wait),否則run()將立即返回。

Live On Coliru

注清理(去除所有不必要newdelete亂七八糟)。另外,是如何創建一個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; 
} 
相關問題