1

我为我的项目编写了一个计时器类。我使用了标准的 C++ 函数调用。

我想创建一个计时器(开始、停止、暂停、继续、重置)并传递新的时间。

如果计时器在我停止之前触发,我想在给定通道上获取 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();
}

...然后在堆栈上创建计时器,当我退出此函数(及其变量等)​​时不再有效。计时器还会倒计时并触发我的脉搏吗?或者我是否必须在我的头文件中为这个计时器使用分类器?

4

1 回答 1

1

好的,我解决了所有问题;> 如果 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();
}
于 2012-12-05T18:52:59.057 回答