Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* header.h */
- #ifndef _Timer_Header_Included_
- #define _Timer_Header_Included_
- #include <stdbool.h>
- struct TimerLink;
- typedef struct
- {
- unsigned timeOut;
- void(*function)();
- struct TimerLink* next;
- } TimerLink;
- TimerLink* CreateTimerLink(void(*)(), unsigned);
- void InsertTimerIntoChain(TimerLink*);
- bool CheckTimerChain();
- void GetSomeSleep();
- #endif // _Timer_Header_Included_
- /* /header.h */
- /* source.c */
- #include "Header.h"
- #include <stdlib.h>
- TimerLink* timerChainHead = NULL;
- unsigned currentTime = 1;
- unsigned sleepTime = 0;
- TimerLink* CreateTimerLink(void(*f)(), unsigned s)
- {
- TimerLink* ptr = malloc(sizeof(TimerLink));
- ptr->function = f;
- ptr->timeOut = s;
- ptr->next = NULL;
- return ptr;
- }
- void InsertTimerIntoChain(TimerLink* ptr)
- {
- if (!timerChainHead)
- {
- timerChainHead = ptr;
- return;
- }
- if (timerChainHead->timeOut < ptr->timeOut)
- {
- ptr->next = timerChainHead;
- timerChainHead = ptr;
- return;
- }
- else
- {
- TimerLink* preIter = timerChainHead;
- for (TimerLink* iter = preIter->next; iter; iter = iter->next, preIter = preIter->next)
- {
- if (iter->timeOut < ptr)
- continue;
- else
- {
- ptr->next = iter;
- preIter->next = ptr;
- return;
- }
- }
- }
- }
- bool CheckTimerChain()
- {
- if (!timerChainHead)
- return true;
- if (timerChainHead->timeOut % currentTime == 0)
- {
- timerChainHead->function();
- if (timerChainHead->next)
- {
- TimerLink* next = timerChainHead->next;
- sleepTime = next->timeOut - timerChainHead->timeOut;
- }
- TimerLink* killer = timerChainHead;
- timerChainHead = timerChainHead->next;
- free(killer);
- }
- return false;
- }
- void GetSomeSleep()
- {
- if (sleepTime == 0)
- sleepTime = timerChainHead->timeOut;
- sleep(sleepTime);
- ++currentTime;
- }
- /* /source.c */
- /* main.c */
- #include <stdio.h>
- #include <stdbool.h>
- #include "Header.h"
- void sleep(int seconds);
- void cb_1();
- void cb_2();
- void timer_add(void(*func)(), int seconds)
- {
- TimerLink* ptr = CreateTimerLink(func, seconds);
- if (!ptr)
- {
- fprintf(stderr, "create timer fail");
- return;
- }
- InsertTimerIntoChain(ptr);
- }
- void call_timers()
- {
- while (true)
- {
- bool timeToBreak = CheckTimerChain();
- if (timeToBreak)
- break;
- else
- GetSomeSleep();
- }
- }
- int main()
- {
- timer_add(cb_1, 3);
- timer_add(cb_2, 7);
- timer_add(cb_1, 5);
- timer_add(cb_2, 9);
- call_timers();
- return 0;
- }
- /* /main.c */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement