我試圖實現由我的C++代碼控制的硬件設備的同步操作。確保boost :: deadline_timer不會接受新的等待,除非先前的等待已過期
假設有兩種類型的設備在那裏我可以執行Open/Close
。 我需要實現的是爲Specified Duration
打開一種類型的設備。第二種設備也是如此。
我已經寫代碼boost::deadline_timer
:
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/thread.hpp>
#include <boost/asio.hpp>
class Test : public std::enable_shared_from_this <Test>
{
public:
Test() :io_(), timerOne_(io_),timerTwo_(io_){}
void Open(int num);
void Close(int num);
void TimedOpen(int num, int dur);
void Run();
private:
boost::asio::io_service io_;
boost::asio::deadline_timer timerOne_;
boost::asio::deadline_timer timerTwo_;
};
void Test::Open(int type)
{
std::cout << "Open for Number : " << type << std::endl;
}
void Test::Close(int type)
{
std::cout << "Close for Number : " << type << std::endl;
}
void Test::TimedOpen(int type, int dur)
{
switch (type)
{
case 1:
{
io_.reset();
auto fn = std::bind(&Test::Open, shared_from_this(), std::placeholders::_1);
fn(type);
timerOne_.expires_from_now(boost::posix_time::seconds(dur));
timerOne_.async_wait(std::bind(&Test::Close, shared_from_this(), type));
Run();
std::cout << "Function Exiting" << std::endl;
std::cout << "-----------------------------------------------" << std::endl;
return;
}
case 2:
{
io_.reset();
auto fn = std::bind(&Test::Open, shared_from_this(), std::placeholders::_1);
fn(type);
timerTwo_.expires_from_now(boost::posix_time::seconds(dur));
timerTwo_.async_wait(std::bind(&Test::Close, shared_from_this(), type));
Run();
std::cout << "Function Exiting" << std::endl;
std::cout << "-----------------------------------------------" << std::endl;
return;
}
}
}
void Test::Run()
{
boost::thread th(boost::bind(&boost::asio::io_service::run, &io_));
}
int main()
{
auto t = std::make_shared<Test>();
t->TimedOpen(1, 60);
t->TimedOpen(2, 30);
t->TimedOpen(1, 5);
t->TimedOpen(2, 2);
char line[128];
while (std::cin.getline(line, 128))
{
if (strcmp(line, "\n")) break;
}
return 0;
}
輸出爲:
Open for Number : 1
Function Exiting
-----------------------------------------------
Open for Number : 2
Function Exiting
-----------------------------------------------
Open for Number : 1
Close for Number : 1
Function Exiting
-----------------------------------------------
Open for Number : 2
Close for Number : 2
Function Exiting
-----------------------------------------------
Close for Number : 2
Close for Number : 1
對於timerOne_
爲t->TimedOpen(1, 5)
執行之前的動作它不會等待以前wait
到即作爲即將到期t->TimedOpen(1, 60)
被取消。
因此Close for Number : 1
出現在輸出中,沒有等待t->TimedOpen(1, 60)
。
我想實現的是,如果multiple waits are encountered
任何類型的timer
,所有的操作應即如果鍵入排隊
:
t->TimedOpen(1, 60);
t->TimedOpen(1, 10);
t->TimedOpen(1, 5);
應該爲60+10+5
秒做TimedOpen Operation
。目前它只有5秒。也應該是非阻塞的,即我不能使用wait() instead of async_wait()
。
我該如何實現它?
摘要: 我的要求是安排在boost::deadline_timer()
即多個操作操作上,除非前面的等待已過期,將被排隊。
IMHO一個解決方案是在'TimedOpen'方法積聚定時器持續時間('dur'),存儲所述第一'的時間TimedOpen'調用和使用'basic_deadline_timer :: expires_at'方法總結的初始時間和時間總結,而不是'basic_deadline_timer :: expires_from_now' – megabyte1024 2015-04-01 07:16:11
@ megabyte1024積累不會給我..調度功能..假設我想確保順序操作..它不能確保 – 2015-04-01 07:45:15
不是清除..我是否正確理解3個調用dead_line定時器處理程序的例子需要3個'TimeOpen'調用?如果是的話,那麼你需要建立你自己的操作隊列等等。'expires_from_now'取消所有待處理的異步等待。請參閱[幫助](http://www.boost.org/doc/libs/1_57_0/doc/html/boost_asio/reference/basic_deadline_timer.html)。 – megabyte1024 2015-04-01 08:31:28