#include #include #include #include #define TIMERS 16 typedef unsigned long DWORD; static struct itimerval itval; void timer_handler(int); static DWORD qwtimer; static DWORD oldtmr; typedef void (*PFNTIMER)(void); typedef struct XLWTIMER{ int avail; int index; int id; int elapse; DWORD oldtmr; PFNTIMER timerfunc; }XLWTIMER, *PXLWTIMER; static XLWTIMER xlwtmr[TIMERS]; static XLWTIMER zero = { (int)0, (int)0, (int)0, (int)0, (DWORD)0UL, (PFNTIMER)NULL }; void SetTimer(int id, int elapse, PFNTIMER pfnt) { int i; for(i = 0; i < 10; i++) { if(0 == xlwtmr[i].avail) { xlwtmr[i].avail = 1; xlwtmr[i].index = i; xlwtmr[i].id = id; xlwtmr[i].elapse = elapse; xlwtmr[i].oldtmr = qwtimer; xlwtmr[i].timerfunc = pfnt; return; } } } void KillTimer(int id) { int i; for(i = 0; i < 10; i++) { if (id == xlwtmr[i].id) { xlwtmr[i] = zero; return; } } } void test10() { printf("\n10"); return; } void test150() { printf("\n 150"); return; } void test35() { printf("\n 35"); return; } void test200() { printf("\n 200"); return; } int main(int argc, char **argv) { qwtimer = 0UL; oldtmr = 0UL; memset(xlwtmr, 0, sizeof(XLWTIMER) * 10); signal(SIGALRM, timer_handler); /* create the interval timer */ memset(&itval, 0, sizeof(struct itimerval)); itval.it_interval.tv_sec = 0; itval.it_interval.tv_usec = 10; itval.it_value.tv_sec = 0; itval.it_value.tv_usec = 10; setitimer(ITIMER_REAL, &itval, NULL); SetTimer(1, 10, test10); SetTimer(2, 150, test150); SetTimer(3, 35, test35); SetTimer(4, 200, test200); getchar(); KillTimer(1); getchar(); KillTimer(2); getchar(); KillTimer(4); getchar(); KillTimer(3); SetTimer(4, 200, test200); getchar(); //while(1); // // getchar(); return (EXIT_SUCCESS); } void timer_handler(int j) { int i; signal(SIGALRM, SIG_IGN); qwtimer += 10; for(i = 0; i < 10; i++) { if(1 == (xlwtmr[i].avail) && 0 == (qwtimer % xlwtmr[i].elapse) && (qwtimer - xlwtmr[i].oldtmr) >= xlwtmr[i].elapse) { xlwtmr[i].timerfunc(); xlwtmr[i].oldtmr = qwtimer; } } signal(SIGALRM, timer_handler); return; }