Linux中的计时器事件功能

问题描述

我试图从相应的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 (将#修改为@)