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();
}
...那麼計時器在棧上創建的,當我退出此功能(和其變量等)不再有效。定時器是否會倒數並激發我的脈搏?或者我將不得不在我的頭文件中使用這個定時器的分類器?
我編輯你的問題。沒有C/C++這樣的語言,並且C中肯定沒有類。這是一個C++問題。 – netcoder
確定,但計時器的呼籲也用於C ....多數民衆贊成我的意思:) thx – user1276012
按定義C++可以訪問C所有的東西。所以說C++就夠了。 –