2012-12-04 43 views
0

我爲我的項目編寫了一個計時器類。我使用了標準C++函數調用。C++ Timer類,也用於QNX脈衝信息

我想創建一個計時器(開始,停止,暫停,繼續,重置)它,並且還傳遞它新的計時。

如果定時器在我停止之前觸發,我想在給定通道上獲得qnx脈衝消息。

這是標題:

#ifndef TIMER_H_ 
#define TIMER_H_ 

#include <time.h> 
#include <sys/neutrino.h> 
#include "HWaccess.h" 
#include "address.h" 

#define MILLISECONDS_NANOSECONDS_CONV 1000000 
#define SECONDS_MILLISECONDS_CONV  1000 

class Timer { 
public: 
    /** 
    * Constructor creates a new timer, attaches to the given 
    * channel. 
    * Does not start timer! 
    * 
    * @param chid 
    * @param seconds 
    * @param milliseconds 
    * @param msg 
    */ 
    Timer(int chid, int sec, int msec, int msg); 

    /** 
    * Deletes timer after detach from channel 
    */ 
    virtual ~Timer(); 

    /** 
    * Starts the timer 
    */ 
    void start(); 

    /** 
    * Stops timer and resets it to initial values 
    */ 
    void stop(); 

    /** 
    * Pauses the timer 
    */ 
    void pause(); 

    /** 
    * Continues the timer 
    */ 
    void cont(); 

    /** 
    * Resets the timer to initial values 
    */ 
    void reset(); 

    /** 
    * Changes timer values to new given values and 
    * resets it 
    * Does not start the timer! 
    * 
    * @param seconds 
    * @param milliseconds 
    */ 
    void changeTime(int sec, int msec); 

private: 
    /** 
    * Timer ID 
    */ 
    timer_t timerid; 

    /** 
    * Timerstruct for running timer 
    */ 
    struct itimerspec timer; 

    /** 
    * Timerstruct for backing up the running timer 
    */ 
    struct itimerspec backupTimer; 

    /** 
    * timer value: seconds 
    */ 
    int seconds; 

    /** 
    * timer value: milliseconds 
    */ 
    int miliSeconds; 

    /** 
    * Connection ID for timeout pulse 
    */ 
    int coid; 

    /** 
    * Event structure for timer if it fires 
    */ 
    struct sigevent event; 
}; 

#endif /* TIMER_H_ */ 

...和實現:

#include "Timer.h" 

Timer::Timer(int chid, int sec, int msec, int msg) { 
    if ((coid = ConnectAttach(0, 0, chid, _NTO_SIDE_CHANNEL, 0)) == -1) { 
     printf("Timer: Error in ConnectAttach\n"); 
    } 

    SIGEV_PULSE_INIT(&event, coid, SIGEV_PULSE_PRIO_INHERIT, PULSE_FROM_TIMER, msg/*Timer abgelaufen*/); 

    if (timer_create(CLOCK_REALTIME, &event, &timerid) == -1) { 
     printf("Timer: Error in timer_create()\n"); 
    } 

    seconds = sec; 
    miliSeconds = msec; 

    reset(); 
} 

Timer::~Timer() { 
    if (ConnectDetach(coid) == -1) { 
     printf("Timer: Error in ConnectDetach\n"); 
    } 

    if (timer_delete(timerid) == -1) { 
     printf("Timer: Error in timer_delete()\n"); 
    } 
} 

void Timer::start() { 
    if(timer_settime(timerid, 0, &timer, NULL) == -1){ 
     printf("Timer: Error in timer_settime()\n"); 
    } 
} 

void Timer::stop() { 
    // stop timer 
    timer.it_value.tv_sec = 0; 
    timer.it_value.tv_nsec = 0; 
    timer.it_interval.tv_sec = 0; 
    timer.it_interval.tv_nsec = 0; 
    if(timer_settime(timerid, 0, &timer, NULL) == -1){ 
     printf("Timer: Error in timer_settime()\n"); 
    } 

    // reset it 
    reset(); 
} 

void Timer::pause() { 
    timer.it_value.tv_sec = 0; 
    timer.it_value.tv_nsec = 0; 
    timer.it_interval.tv_sec = 0; 
    timer.it_interval.tv_nsec = 0; 

    // backup running timer values 
    if(timer_gettime(timerid, &backupTimer) == -1){ 
     printf("Timer: Error in timer_gettime()\n"); 
    } 
    // disarm 
    if(timer_settime(timerid, 0, &timer, NULL) == -1){ 
     printf("Timer: Error in timer_settime()\n"); 
    } 
} 

void Timer::cont() { 
    // recover old values 
    timer = backupTimer; 
    // Arm timer 
    if(timer_settime(timerid, 0, &timer, NULL) == -1) { 
     printf("Timer: Error in timer_settime()\n"); 
    } 
} 

void Timer::reset(){ 
    timer.it_value.tv_sec = seconds; 
    timer.it_value.tv_nsec = miliSeconds * MILLISECONDS_NANOSECONDS_CONV; 
    timer.it_interval.tv_sec = 0; 
    timer.it_interval.tv_nsec = 0; 
} 

void Timer::changeTime(int sec, int msec){ 
    seconds = sec; 
    miliSeconds = msec; 
    reset(); 
} 

1)我可以設置定時結構的值爲零(停止計時器)和備份我在做這件事的方式在另一個結構中的值?或者是計時器結構中運行的計時器遞減?

2)我可以輕鬆地恢復舊的計時器值與一個簡單的timer = backupTimer

3)最後,如果我創建並啓動函數中的計時器,像這樣:

void coolClass::interestingFunction() { 
    //do other time consuming stuff here... 
    Timer timer(chid, 10, 0); 
    timer.start(); 
} 

...那麼計時器在棧上創建的,當我退出此功能(和其變量等)​​不再有效。定時器是否會倒數並激發我的脈搏?或者我將不得不在我的頭文件中使用這個定時器的分類器?

+0

我編輯你的問題。沒有C/C++這樣的語言,並且C中肯定沒有類。這是一個C++問題。 – netcoder

+0

確定,但計時器的呼籲也用於C ....多數民衆贊成我的意思:) thx – user1276012

+0

按定義C++可以訪問C所有的東西。所以說C++就夠了。 –

回答

0

好吧,我修好了我的所有問題;> 如果some1是怎麼感興趣,繼承人的修改後的代碼:

#include "Timer.h" 

Timer::Timer(int chid, int sec, int msec, int msg) { 
    if ((coid = ConnectAttach(0, 0, chid, _NTO_SIDE_CHANNEL, 0)) == -1) { 
     printf("Timer: Error in ConnectAttach\n"); 
    } 

    SIGEV_PULSE_INIT(&event, coid, SIGEV_PULSE_PRIO_INHERIT, PULSE_FROM_TIMER, msg/*Timer abgelaufen*/); 

    if (timer_create(CLOCK_REALTIME, &event, &timerid) == -1) { 
     printf("Timer: Error in timer_create()\n"); 
    } 

    seconds = sec; 
    miliSeconds = msec; 

    reset(); 
} 

Timer::~Timer() { 
    if (ConnectDetach(coid) == -1) { 
     printf("Timer: Error in ConnectDetach\n"); 
    } 

    if (timer_delete(timerid) == -1) { 
     printf("Timer: Error in timer_delete()\n"); 
    } 
} 

void Timer::start() { 
    //TODO running flag, wg doppelt pause/continue 
    if(timer_settime(timerid, 0, &timer, NULL) == -1){ 
     printf("Timer: Error in timer_settime()\n"); 
    } 
} 

void Timer::stop() { 
    // Stoppe den Timer 
    if(timer_settime(timerid, 0, NULL, NULL) == -1){ 
     printf("Timer: Error in timer_settime()\n"); 
    } 

    // Zuruecksetzen 
    reset(); 
} 

void Timer::pause() { 
    // disarm (da erster Wert NULL) 
    if(timer_settime(timerid, 0, NULL, &backupTimer) == -1){ 
     printf("Timer: Error in timer_settime()\n"); 
    } 
} 

void Timer::cont() { 
    // Arm, da Werte im struct wieder != 0 
    if(timer_settime(timerid, 0, &backupTimer, NULL) == -1) { 
     printf("Timer: Error in timer_settime()\n"); 
    } 
} 

void Timer::reset(){ 
    timer.it_value.tv_sec = seconds; 
    timer.it_value.tv_nsec = miliSeconds * MILLISECONDS_NANOSECONDS_CONV; 
    timer.it_interval.tv_sec = 0; 
    timer.it_interval.tv_nsec = 0; 
} 

void Timer::changeTime(int sec, int msec){ 
    seconds = sec; 
    miliSeconds = msec; 
    reset(); 
}