就像java一样,c ++中有像timer和timertask这样的东西吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了就像java一样,c ++中有像timer和timertask这样的东西吗?相关的知识,希望对你有一定的参考价值。
我不是一个经验丰富的c ++程序员。所以我只想知道如何实现定时器和timertask就像Java在C ++中一样。我已经尝试过timer_create
示例,它位于timer_create的手册页中,但它不能按照我的要求工作。我希望在特定时间跨度之后,事件应该触发,如果特定条件满足,则应取消定时器。
任何帮助将受到高度赞赏。谢谢,Yuvi。
这通常是一个非常困难的问题,因为您本身就要求一些并发或至少异步处理。
最简单的单线程解决方案是使用像Posix的alarm(2)
这样的东西。这将导致在指定时间后将信号发送到您的进程。您需要注册信号处理程序(例如使用signal(2)
),但您必须遵守其所有限制(例如,您只能在处理程序中调用异步安全函数)。
第二个单线程选项是使用select
样式(或epoll
样式)I / O循环并使用内核计时器文件描述符。这是一个非常新的Linux功能,因此可用性会有所不同。
最后,典型的通用解决方案是使用多个线程:为计时器创建一个专用线程,其唯一目的是在设定的时间范围内休眠,然后执行一些代码。为此,您必须承担并发编程职责的全部重要性,例如处理共享数据,保证没有比赛等。
一旦你决定沿着多线程路线走下去,一些像Boost.ASIO这样的高级库和新的标准库提供了一些很好的计时机制。
我也在寻找像TimerTask这样的Java,但是当我遇到这个问题时,我需要一个用于Windows C ++的Java。经过一天的研究主要是关于SO和学习传递类成员函数,我能够提出一个似乎对我有用的解决方案。我意识到我在回答这个问题方面已经很晚了,但也许有人仍然在寻找这个解决方案会发现这很有用。
这是Windows解决方案,我在Windows 10上使用Visual Studio C ++进行了测试。我还在学习C ++,所以如果我违反任何规则,请保持温和。我意识到例外是基本的,但它们很容易根据您的需求进行定制。我创建了一个类似于Java类的TimerTask类。您需要从TimerTask类派生一个新的用户类,并创建一个“任务”函数,其中包含您希望定期执行的代码。这是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!
";
}
};
int main()
{
cout << "Hello, TimerTask!
";
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;
}
以上是关于就像java一样,c ++中有像timer和timertask这样的东西吗?的主要内容,如果未能解决你的问题,请参考以下文章