我有一個應用程序,我希望每x毫秒顯示一個幀。準確的連續計時器回調
以前我做的是這樣的:
class SomeClass
{
boost::thread thread_;
boost::timer timer_;
public:
SomeClass() : thread_([=]{Display();})
{
}
void Display
{
double wait = 1.0/fps*1000.0;
while(isRunning_)
{
double elapsed = timer.elapsed()*1000.0;
if(elapsed < wait)
boost::this_thread::sleep(boost::posix_time::milliseconds(static_cast<unsigned int>(wait - elapsed)));
timer.restart();
// ... Get Frame. This can block while no frames are being rendered.
// ... Display Frame.
}
}
}
不過,我不認爲解決方案有很好的精度。我可能錯了?
我希望能用boost :: asio :: deadline_timer代替,但我不確定如何使用它。
這是我試過的,這似乎沒有等待。它似乎只是儘可能快地渲染幀。
class SomeClass
{
boost::thread thread_;
boost::asio::io_service io_;
boost::asio::deadline_timer timer_;
public:
SomeClass() : timer_(io_, 1.0/fps*1000.0)
{
timer_.async_wait([=]{Display();});
thread_ = boost::thread([=]{io_.run();})
}
void Display
{
double wait = 1.0/fps*1000.0;
while(isRunning_)
{
timer_.expires_from_now(boost::posix_time::milliseconds(wait_)); // Could this overflow?
// ... Get Frame. This can block while no frames are being rendered.
// ... Display Frame.
timer_.async_wait([=]{Display();});
}
}
}
我在做什麼錯?如果我得到這個解決方案的工作會比第一個更好嗎?
我不熟悉這個語法'timer_.async_wait([=] {顯示();});'它有什麼作用? – 2010-07-26 14:40:23
如果你的意思是[=] {Display();}),那麼它只是一個C++ 11x lambda表達式。它是寫函數對象的簡寫。 – ronag 2010-08-06 18:14:34