c++ - 如何在一个类中同时运行某些东西(在单线程平台中)?
问题描述
我必须编写一个实现下面给定接口的类。当我调用 start 函数时,它应该每 1 毫秒开始计数,当我调用 stop 函数时,它应该停止计数。读取函数应该返回计数器的值。
我应该如何编写这个实现,因为我正在为没有任何 RTOS 的微控制器实现这个。因此,这个项目是严格的单线程的,我看不出如何在没有线程的情况下实现它。
class Counter{
public:
virtual void stop() = 0;
virtual void start() = 0;
virtual int read() = 0;
};
示例用法:
int main()
{
Counter *cnt = new Counter_Implemented();
cnt->start();
//do some heavy task here
cnt->stop();
int duration = cnt->read();
}
解决方案
如果您可以访问std::chrono
您的 MCU 平台/编译器,则可以使用以下代码。否则,解决方案是使用 HAL 或带中断的集成定时器。如P__J__ 所述
您可以使用两个时间戳之间的差异来实现这一点。已start
存储当前时间戳,然后停止将存储结束时间戳。 read
然后会给你差异,或者如果计时器当前正在运行,然后得到now
与起点的不同。那看起来像
class Counter{
public:
void stop()
{
end = std::chrono::steady_clock::now();
}
void start()
{
start = std::chrono::steady_clock::now();
}
int read()
{
if (start >= end) // timmer currently running
return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - start).count();
return std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
}
private
std::chrono::time_point<std::chrono::steady_clock> start{};
std::chrono::time_point<std::chrono::steady_clock> end{};
};
推荐阅读
- android - 从recyclerview中选择项目后如何隐藏软键盘?
- c++ - 在静态库中内联类方法
- ubuntu - unit ark.service未正确加载:Exec格式错误
- javascript - mediarecorder.requestdata 不返回任何内容
- html - 如何在html中对齐卡片?
- python - PyQt5 中的可滚动 QLabel 图像
- ruby - Ruby 正则表达式匹配 vs ===
- python-3.x - 如何连接字符串和变量并在python中为其赋值
- groovy - 如何在 JIRA 脚本运行器 groovy 中运行 shell 命令
- html - 如何根据Angular 6中的单列实现排序表(使用boostrap)