问题描述
我试图从相应的Windows代码开始在Linux中实现C ++计时器事件功能。
我的Windows代码如下:
标题:
#include <Windows.h>
#include <MMSystem.h>
#pragma comment(lib,"Winmm.lib")
class TimerManager
{
public:
typedef void (*TimerManagerCallback)(void *);
private:
struct CallbacksData
{
TimerManagerCallback callbackFunc;
int periodTicks;
int currentTick;
void * pointer;
};
CallbacksData callbacks[MAX_CALLBACKS];
unsigned int callbacksSize;
HANDLE hTimer;
HANDLE hTimerQueue;
TimerManager();
bool startInternal();
public:
static TimerManager & getInstance();
void timerTick();
~TimerManager();
bool addCallback(TimerManagerCallback,int periodTicks,void * pointer);
};
代码:
#define PERIOD 5
#define MAX_CALLBACKS 100
extern "C"
static void CALLBACK internalTimerProc(UINT id,UINT msg,DWORD_PTR dwUser,DWORD_PTR dw1,DWORD_PTR dw2)
{
TimerManager::getInstance().timerTick();
}
void TimerManager::timerTick()
{
for(unsigned int i = 0;i<callbacksSize;i++)
{
callbacks[i].currentTick = (callbacks[i].currentTick+1) % callbacks[i].periodTicks;
if(callbacks[i].currentTick == 0)
callbacks[i].callbackFunc(callbacks[i].pointer);
}
}
bool TimerManager::addCallback(TimerManagerCallback tmc,void * pointer)
{
if(callbacksSize >= MAX_CALLBACKS)
return false;
callbacks[callbacksSize].callbackFunc = tmc;
callbacks[callbacksSize].periodTicks = periodTicks;
callbacks[callbacksSize].currentTick = 0;
callbacks[callbacksSize].pointer = pointer;
callbacksSize++;
return true;
}
TimerManager::TimerManager():callbacksSize(0)
{
startInternal();
}
bool TimerManager::startInternal()
{
int arg = 100;
hTimerQueue = CreateTimerQueue();
bool results = CreateTimerQueueTimer(&hTimer,hTimerQueue,(WAITORTIMERCALLBACK)internalTimerProc,&arg,PERIOD,0);
if (NULL != results)
{
return true;
}
return false;
}
TimerManager & TimerManager::getInstance()
{
static TimerManager instance;
return instance;
}
TimerManager::~TimerManager()
{
DeleteTimerQueueTimer(hTimerQueue,hTimer,INVALID_HANDLE_VALUE);
}
我尝试使用timerfd_create创建计时器,并使用epoll_ctl来管理队列,但是我无法复制回调函数。在Linux平台上如何复制代码?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)