#ifndef PITIMER_H #define PITIMER_H #include #include #include "pithread.h" #include "pistring.h" typedef void (*TimerEvent)(void * , int ); struct PITime { int seconds; int minutes; int hours; }; struct PIDate { int day; int month; int year; // since 1900 }; class PITimer #ifdef WINDOWS : public PIThread #endif { public: PITimer(TimerEvent slot = 0, void * data = 0); ~PITimer() {stop();} void setData(void * data_) {data = data_;} void setSlot(TimerEvent slot) {ret_func = slot;} #ifdef WINDOWS void reset() {t_st = GetCurrentTime();} #else void reset() {clock_gettime(0, &t_st);} void start(double msecs); void stop() {if (ti == 0) timer_delete(timer); ti = -1; running = false;} bool isRunning() const {return running;} void needLockRun(bool need) {lockRun = need;} void lock() {mutex_.lock();} void unlock() {mutex_.unlock();} #endif void addDelimiter(int delim, TimerEvent slot = 0) {ret_funcs << TimerSlot(slot, delim);} void removeDelimiter(int delim) {for (int i = 0; i < ret_funcs.size_s(); ++i) if (ret_funcs[i].delim == delim) {ret_funcs.remove(i); i--;}} void removeDelimiter(TimerEvent slot) {for (int i = 0; i < ret_funcs.size_s(); ++i) if (ret_funcs[i].slot == slot) {ret_funcs.remove(i); i--;}} void removeDelimiter(int delim, TimerEvent slot) {for (int i = 0; i < ret_funcs.size_s(); ++i) if (ret_funcs[i].slot == slot && ret_funcs[i].delim == delim) {ret_funcs.remove(i); i--;}} void clearDelimiters() {ret_funcs.clear();} double elapsed_n(); // nanoseconds double elapsed_u(); // microseconds double elapsed_m(); // miliseconds double elapsed_s(); // seconds private: #ifdef WINDOWS void run(); long int t_st, t_cur; #else static void timer_event(sigval e); bool running; volatile bool lockRun; PIMutex mutex_; int ti; itimerspec spec; timespec t_st, t_cur; timer_t timer; sigevent se; #endif struct TimerSlot { TimerSlot(TimerEvent slot_ = 0, int delim_ = 1) {slot = slot_; delim = delim_; tick = 0;} TimerEvent slot; int delim; int tick; }; void * data; TimerEvent ret_func; PIVector ret_funcs; }; PITime currentTime(); PIDate currentDate(); PIString time2string(const PITime & time, const PIString & format = "h:mm:ss"); PIString date2string(const PIDate & date, const PIString & format = "d.mm.yyyy"); #endif // PITIMER_H