boost截止日期计时器在iOS中过期不准确
boost deadline timer expires not accurate in iOS
我使用非常简单的代码来测试iOS 中的截止日期计时器
结果不准确:在Desktop或Simulator中,结果将为20或21,在Mobile中,结果将是24,25,我想实现一个播放器库,所以5ms错误不可接受。
如何在iOS上使计时器更准确
这是代码:
boost::thread* _thread;
boost::asio::deadline_timer* _timer;
boost::asio::io_service _io_service;
boost::posix_time::ptime _lastTime;
void test()
{
_timer = new boost::asio::deadline_timer(_io_service);
_timer->expires_from_now(boost::posix_time::milliseconds(0));
_timer->async_wait(boost::bind(case1));
_thread = new boost::thread(boost::bind(&boost::asio::io_service::run, &_io_service));
}
void case1()
{
boost::posix_time::ptime currentTime = boost::posix_time::microsec_clock::local_time();
if (_lastTime.is_not_a_date_time() == false) {
boost::posix_time::time_duration diff = currentTime - _lastTime;
std::cout << "run time: " << diff.total_milliseconds() << std::endl;
}
_lastTime = boost::posix_time::microsec_clock::local_time();
_timer->expires_from_now(boost::posix_time::milliseconds(20));
_timer->async_wait(boost::bind(case1));
}
您可能需要使用http://www.boost.org/doc/libs/1_56_0/doc/html/boost_asio/reference/high_resolution_timer.html而chrono::high_resolution_clock
:
查看Coliru直播
输出为run time: 20
,无一例外。
#include <boost/asio.hpp>
#include <boost/chrono.hpp>
#include <boost/bind.hpp>
#include <boost/asio/high_resolution_timer.hpp>
typedef boost::chrono::high_resolution_clock hrc;
using boost::chrono::duration_cast;
using boost::chrono::milliseconds;
boost::asio::io_service io_service_;
boost::asio::high_resolution_timer timer_(io_service_);
hrc::time_point lastTime_ {};
void case1(boost::system::error_code ec)
{
hrc::time_point currentTime = hrc::now();
if (lastTime_.time_since_epoch().count()) {
hrc::duration diff = currentTime - lastTime_;
std::cout << "run time: " << duration_cast<milliseconds>(diff).count() << std::endl;
}
lastTime_ = hrc::now();
timer_.expires_from_now(milliseconds(20));
timer_.async_wait(boost::bind(case1, boost::asio::placeholders::error));
}
void test()
{
timer_.expires_from_now(milliseconds(0));
timer_.async_wait(boost::bind(case1, boost::asio::placeholders::error));
io_service_.run();
}
int main()
{
test();
}
相关文章:
- 使用ios:ate写入到流会覆盖现有文件
- 如何访问RTCVideoRenderer的帧?(ios)
- ios::fmtflags 在 C++ 中是如何工作的?setf() 是如何工作的?
- 我可以在 iOS 或 mac 应用程序中使用C++代码吗?
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 为什么 C++ 11 在 ios 类中添加了运算符 bool
- 'string'文件在带有C++文件的iOS插件上找不到
- c++ libCurl :如何使用libCurl接受过期的证书
- 文件模式标志"ios::app"是否用于删除文件(如果文件已存在)?
- 使用 C++ iOS::ate 获取错误的文件大小
- 使用 适用于 Android 和 iOS 的 tf-lite C++ API
- 如何正确设置 ios 标志以进行流操作?
- 在为 iOS 构建 aws-sdk-cpp 时,cmake 上的 CXX 编译器错误已损坏
- C++ std::locale( "en" ) 在 iOS 上引发异常
- 在瓦尔格林德的泄漏摘要中使用 std::ios::sync_with_stdio(fasle) 打印时获取"still reachable"
- 在iOS应用程序中创建数据库
- Qt & Firebase C++ SDK 在 iOS 上的链接问题
- 在shared_ptr过期后查找weak_ptr
- 是否有可以在iOS上运行的API来更改现有视频的每秒帧数?
- boost截止日期计时器在iOS中过期不准确