支持实时和非实时模式的程序
program supporting real and non-real time modes
我正在尝试将现有程序从(自行开发的)现有时间类转换为使用 C++11 中的新时间设施。 对于实时处理,很清楚如何将 C++11 功能映射到自行开发的时间类中。 目前尚不清楚如何使用C++11计时功能来支持本土课程支持的非实时模式(例如,"以批处理模式的速度运行","以四分之一速度运行演示模式"等)。 这是否通过定义将墙壁时间正确映射到"播放"速度的特殊clock
来实现? 任何帮助都值得赞赏,一个例子会很棒。
例如,我将转换的代码具有诸如
MessageQueue::poll( Seconds( 1 ) );
或
sleep( Minutes( 2 ) );
其中Seconds
或Minutes
对象知道程序的运行速度,以避免必须到处使用乘法器或转换函数,例如
MessageQueue::poll( PlaybackSpeed * Seconds( 1 ) );
或
MessageQueue::poll( PlaybackSpeed( Seconds( 1 ) ) );
我希望有可能通过提供自定义clock
来获得与std::chrono::duration
和std::chrono::time_point
相同的行为。
制作自己的时钟是否足够取决于您如何使用创建的持续时间。例如,如果您想以半速奔跑,但在某个地方称为:
std::this_thread::sleep_for(std::chrono::minutes(2));
持续时间不会调整。相反,您需要使用sleep_until并提供使用"慢"时钟的时间点。但是制作一个运行缓慢的时钟非常容易:
template<typename Clock,int slowness>
struct slow_clock {
using rep = typename Clock::rep;
using period = typename Clock::period;
using duration = typename Clock::duration;
using time_point = std::chrono::time_point<slow_clock>;
constexpr static bool is_steady = Clock::is_steady;
static time_point now() {
return time_point(start_time.time_since_epoch() + ((Clock::now() - start_time)/slowness));
}
static const typename Clock::time_point start_time;
};
template<typename Clock,int slowness>
const typename Clock::time_point
slow_clock<Clock,slowness>::start_time = Clock::now();
从 now() 返回的time_points相对于您给出的时钟,似乎以较慢的速度前进。例如,这里有一个程序,所以你可以观看纳秒慢慢滴答作响:
int main() {
using Clock = slow_clock<std::chrono::high_resolution_clock,500000000>;
for(int i=0;i<10;++i) {
std::this_thread::sleep_until(Clock::now()
+ std::chrono::nanoseconds(1));
std::cout << "tickn";
}
}
您实现的所有函数,如MessageQueue::poll()
,可能需要根据全局时钟类型定义来实现。
当然,这些都与程序的实际运行速度无关,除非你根据它们减慢了程序的速度。超时的函数需要更长的时间,sleep_until需要更长的时间,但是不等待未来某个时间点的操作看起来会更快。
// appears to run a million times faster than normal according to (finish-start)
auto start = slow_clock<steady_clock,1000000>::now();
do_slow_operation();
auto finish = slow_clock<steady_clock,1000000>::now();
对于这种情况:
MessageQueue::poll( Seconds( 1 ) );
如果您只是让您的 MessageQueue 了解它应该以什么"速度"运行,则可以轻松使用标准时间类。 如果你想以半速运行,只需调用类似MessageQueue::setPlaybackSpeed(0.5)
的东西,并从那以后当有人给它一段时间时让队列使用该因素。
至于这个:
sleep( Minutes( 2 ) );
您的旧代码在做什么? 我想 Minutes() 创建的任何对象都有一个隐式转换运算符到 int 返回秒数? 这对我来说似乎太神奇了 - 最好只在你的MessageQueue或其他类上创建一个sleep()方法,然后你可以使用与上面相同的解决方案。
- 如何在实时应用程序中锁定线程
- 如何提高 OpenCV 实时检测器应用程序的帧率?
- C# 的垃圾回收会给实时音频应用程序带来问题吗?
- 如何将此项目更改为 OpenCV 实时人脸检测应用程序?
- C .exe在C#实时相机流应用程序中
- 在实时程序中是动态内存访问有害的
- Qt GUI应用程序在与GUI交互时停止实时进程
- 关于如何将传统嵌入式应用程序约束为实时应用程序的建议
- Microsoft Windows 7 专业版上的实时应用程序
- 是实时将数据写入文件更好,还是在程序关闭时写入文件更好
- 支持实时和非实时模式的程序
- 实时音频应用程序,提高性能
- 如何在windows中实时监控目录,从程序退出到重新启动
- xiAPI:无法更改线程调度程序,请检查实时优先级的用户限制
- Linux c++用户空间应用程序实时睡眠功能(POSIX,树莓派)
- 在实时应用程序中最坏情况下执行的最快c++映射
- 我应该选择什么样的同步方案来避免在实时,c++ /MFC应用程序上的死锁
- 迷你过滤器驱动程序-我应该过滤哪个IRP请求以进行实时病毒防护
- FEM库的实时应用程序
- 实时应用程序中的内存泄漏检查