在 c++ 中是否有像 timer 和 timertask 这样的东西,就像 java 一样
Is there anything like timer and timertask in c++ just like java has?
我不是一个有经验的c++程序员。所以我只想知道如何实现计时器和计时器任务,就像 java 在C++中一样。我已经尝试了timer_create手册页中的示例timer_create
但它没有按照我的要求工作。我希望在特定的时间跨度之后应该触发一个事件,如果满足特定条件,则应取消计时器。
任何帮助将不胜感激。谢谢尤维。
在寻找像TimerTask这样的Java,但是当我遇到这个问题时,我需要Windows C++。经过一天主要研究 SO 并学习传递类成员函数,我能够组合出一个似乎适合我的解决方案。我意识到我在回答这个问题方面晚了几年,但也许仍在寻找此解决方案的人会发现这很有用。
这是我使用Visual Studio C++在Windows 10上测试的仅限Windows的解决方案。我还在学习C++所以如果我违反了任何规则,请保持温柔。我意识到例外是基本的,但它们很容易根据您的需求进行定制。我创建了一个类似于Java类的TimerTask类。您需要从 TimerTask 类派生一个新的用户类,并创建一个包含要定期执行的代码的"task"函数。下面是 TimerTask 类:
--TimerTask.h--
#pragma once
#include <thread>
class TimerTask {
HANDLE timeoutEvent;
DWORD msTimeout;
bool exit = false;
void* pObj;
static void taskWrapper(TimerTask* pObj) {
while (!pObj->exit) {
DWORD waitResult = WaitForSingleObject(pObj->timeoutEvent, pObj->msTimeout);
if (pObj->exit)
break;
pObj->task();
}
}
public:
TimerTask::TimerTask() {
timeoutEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (!timeoutEvent) {
throw "TimerTask CreateEvent Error: ";
}
}
TimerTask::~TimerTask() {
CloseHandle(timeoutEvent);
}
// Derived class must create task function that runs at every timer interval.
virtual void task() = 0;
void start(void* pObj, DWORD msTimeout) {
this->pObj = pObj;
this->msTimeout = msTimeout;
std::thread timerThread(taskWrapper, (TimerTask*)pObj);
timerThread.detach();
}
void stop() {
exit = true;
if (!SetEvent(timeoutEvent))
throw "TimerTask:stop(): Error: ";
}
};
下面是一个用法示例。为简洁起见,我没有包括错误检查。
--Test.cpp--
#include "Windows.h"
#include <iostream>
#include "TimerTask.h"
using namespace std;
class KeepAliveTask : public TimerTask {
public:
void task() {
cout << "Insert your code here!n";
}
};
int main()
{
cout << "Hello, TimerTask!n";
KeepAliveTask keepAlive;
keepAlive.start(&keepAlive, 1000); // Execute once per second
Sleep(5100); // Pause 5.1s to give time for task thread to run.
keepAlive.stop();
Sleep(1000); // Pause another sec to give time for thread to stop.
return 0;
}
这通常是一个非常困难的问题,因为您本质上要求一些并发或至少异步处理。
最简单的单线程解决方案是使用类似 Posix 的 alarm(2)
.这将导致在指定时间后向进程发送信号。您需要注册一个信号处理程序(例如,使用 signal(2)
),但您受到其所有限制(例如,您只能在处理程序中调用异步安全函数)。
第二个单线程选项是使用 select
样式(或 epoll
样式)I/O 循环并使用内核计时器文件描述符。不过,这是一个非常新的 Linux 功能,因此可用性会有所不同。
最后,典型的通用解决方案是使用多个线程:为计时器创建一个专用线程,其唯一目的是在设定的时间跨度内休眠,然后执行一些代码。为此,您将不得不承担并发编程责任的全部重量,例如处理共享数据、保证没有比赛等。
一些更高级别的库,如 Boost.ASIO 和新的标准库,一旦你决定走多线程路线,就会提供一些很好的计时机制。
- 是否有技术原因阻止 Java 中的 final C++ 像 const 一样严格?
- Java 是否像C++模板一样具有泛型推论?
- 为什么向量不支持 size 作为成员变量,就像 Java 类中的长度变量一样,而是函数 size()?
- Java,这是可能的吗?自动方法范围跟踪,就像C++中的宏一样
- 如何表达匿名方法覆盖,就像在 java 中使用 c++ 一样
- 就像Java中的指针C++一样
- Java是否有默认的复制构造函数(就像C++中一样)
- 我们有没有像c一样用java进行条件编译
- 在C++中,我可以像在Java中一样拥有一个接口变量吗
- 如何以毫秒为单位获取自 1970 年以来的当前时间戳,就像 Java 一样
- C++:像在 Java 中一样将接口作为参数传递
- 在 c++ 中是否有像 timer 和 timertask 这样的东西,就像 java 一样
- C++像枚举头编译器错误一样的Java
- 我们是否可以像jquery一样在C++/Java中使用链式样式设置器
- 有没有一种更简单的方法可以像在java中使用包一样在C++中重用代码?制作头文件比较复杂
- 是否可以像Java一样在VM中运行,从而使C++平台独立
- C++中的分段错误是否可以像在 Java 中处理 NullPointerExceptions 一样处理
- c++的NEW对象作为参数(和Java一样)
- Java是否像c++一样有未定义的行为?
- 需要学习如何通过指针正确访问实例变量"this"就像在 Java 中一样