下面是关于“C++11实现简易定时器的示例代码”的完整攻略。
标题
C++11实现简易定时器的示例代码
简介
在开发事件驱动或多线程程序时,经常需要一种定时器来控制任务的执行时间。本篇攻略将介绍如何使用C++11编写一个简易的定时器,以此来满足我们在各种场景中的需求。
本攻略将包含两个实例展示如何使用简易定时器,读者可以通过这两个实例学习如何将其应用于自己的项目中。
攻略步骤
1.头文件定义
第一步是定义必需的头文件:<thread>
、<functional>
、<chrono>
和<atomic>
。
c++
#include <thread>
#include <functional>
#include <chrono>
#include <atomic>
using namespace std;
2.声明实现定时器类
声明并定义一个 Timer
类,包含私有成员变量和公共成员函数声明:
class Timer
{
public:
Timer() = default;
Timer(const Timer &t) = delete;
Timer(Timer &&t) = delete;
~Timer();
void start(int32_t interval, function<void(void)> func);
void stop();
private:
void thread_proc();
private:
atomic<bool> m_running{ false };
int32_t m_interval{ 0 };
function<void(void)> m_func;
thread m_thread;
};
在这里,我们使用了C++11中的原子变量 atomic
,其中,在开始定时器时设置为真,在停止定时器时设置为假,并在整个执行过程中用于同步线程。
同时,我们采用函数指针获取定时器执行任务过程中调用的函数,这样可以方便定制任务代码。
3.实现定时器类
接下来我们来实现 Timer
类。
3.1 开始定时器
在开始定时器时,我们首先要记住 interval
和 func
参数。然后启动一个线程来执行定时器逻辑:
void Timer::start(int32_t interval, function<void(void)> func) {
m_interval = interval;
m_func = std::move(func);
m_running = true;
m_thread = thread(&Timer::thread_proc, this);
}
3.2 执行定时器任务
定时器的主要任务是在指定的时间间隔内重复执行特定任务,因此我们需要使用 C++ 11 的 chrono
库来实现计时器。在 thread_proc
函数中,我们将使线程保持在一直执行状态,直到定时器停止。
void Timer::thread_proc() {
while (m_running) {
this_thread::sleep_for(chrono::milliseconds(m_interval));
if (m_running) {
m_func();
}
}
}
3.3 停止定时器
停止定时器很简单,只需先将 m_running
标志设置为 false ,停止线程,在等待线程退出:
void Timer::stop() {
m_running = false;
if (m_thread.joinable()) {
m_thread.join();
}
}
4.使用案例
经过前面的步骤,我们已经成功实现了一个简单的定时器,现在来看看如何在实际项目中使用它。
4.1 基本使用
下面是基本示例,演示如何每隔1秒钟打印一次字符串:
Timer timer;
timer.start(1000, []() { cout << "Hello, World!" << endl; });
this_thread::sleep_for(chrono::seconds(5));
timer.stop();
在这个示例中,我们首先创建了一个 Timer
对象,然后调用 start
函数来开启定时器,参数 interval
是 1000 毫秒表示 1 秒钟,func
是一个函数(lambda 表达式)句柄,用于指定要执行的定时器任务。
接下来,我们在线程执行任务期间,使用 this_thread::sleep_for
函数暂停当前线程 5 秒钟,最后,我们在程序结束之前调用了 stop
函数来停止定时器。
4.2 结合事件循环使用
在大多数情况下,定时器通常与 GUI 程序的事件循环功能一起使用。例如,以下演示如何使用户单击窗口后每隔 1 秒切换一次背景颜色。
int32_t bgColor = WHITE_COLOR;
Timer timer;
while (window.isOpen()) {
render(bgColor); // 渲染窗口界面
sf::Event event;
while (window.pollEvent(event)) {
switch (event.type) {
case sf::Event::Closed:
window.close();
break;
case sf::Event::MouseButtonPressed:
bgColor = bgColor ^ 0x00ffffff; // 切换背景颜色
timer.start(1000, [&bgColor]() {
bgColor = bgColor ^ 0x00ffffff;
});
break;
default:
break;
}
}
}
在这个示例中,首先渲染窗口界面。在事件循环中,我们检查用户是否按下鼠标按钮。如果按下鼠标按钮,则切换背景颜色并设置颜色 bgColor
为新的背景颜色,同时使用 Timer
计时器并传入一个 lambda 表达式, 以便在 1 秒后重新切换并重绘目标颜色。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++11实现简易定时器的示例代码 - Python技术站