Broken_Arrow
asked on
How to create a timer in C that will execute some code when a particular amount of time has elapsed
I was wondering if there is such a function in C that will allow me to enter a time and once that time has elapsed, then execute some code ??
I wish to do something like this
timer(4)
{
executing = false;
}
once the 4 seconds is up I would like the executing flag to be set to false.
I don't know if this is possible but this is what I want to do.
I wish to do something like this
timer(4)
{
executing = false;
}
once the 4 seconds is up I would like the executing flag to be set to false.
I don't know if this is possible but this is what I want to do.
You can use signal() and alarm() or setitimer() to do this. do a "man alarm"
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
I was just trying to figure out how it worked. Thanks I will give that a go
ASKER
Thanks that works perfect
Well, any timer facilities are part of external libraries specific to the environment and not part of the C language
itself, so technically no.
Do you want your program to stop executing and wait until the timer runs out and then
continue?
In that case jaime's suggestion of a busy loop would work, but it would also potentially waste a whole
lot of CPU time -- all your program has access to while possibly mpacting system wide performance
(depending on the environment).
Best to instead issue a sleep call, i.e. sleep(4);
on a unix system #include <unistd.h>
sleep(4);
executing = false;
It sounds like you want this to happen in parallel however (while you're program is doing something
else)
in that case you want to setup a signal handler and use alarm() or setitimer as grg99 suggests
You may have a few other options:
* Store your timers in a list and run the whole program in an event loop, for example
time running out is just one kind of event that would resume execution to take an action
while ( !quitting )
{
event = wait_for_event();
quitting = react_to_event(event);
}
* Or if your code is running inside an active loop and you want the timer to stop the loop by setting
executing to false... have it periodically check
while ( executing ) {
check_time();
... next step in your computation ... }
* Using multi-threaded programming could also achieve this... perhaps you could make a timer thread
which would halt for at least 4 seconds and then set a shared executing variable to false
itself, so technically no.
Do you want your program to stop executing and wait until the timer runs out and then
continue?
In that case jaime's suggestion of a busy loop would work, but it would also potentially waste a whole
lot of CPU time -- all your program has access to while possibly mpacting system wide performance
(depending on the environment).
Best to instead issue a sleep call, i.e. sleep(4);
on a unix system #include <unistd.h>
sleep(4);
executing = false;
It sounds like you want this to happen in parallel however (while you're program is doing something
else)
in that case you want to setup a signal handler and use alarm() or setitimer as grg99 suggests
You may have a few other options:
* Store your timers in a list and run the whole program in an event loop, for example
time running out is just one kind of event that would resume execution to take an action
while ( !quitting )
{
event = wait_for_event();
quitting = react_to_event(event);
}
* Or if your code is running inside an active loop and you want the timer to stop the loop by setting
executing to false... have it periodically check
while ( executing ) {
check_time();
... next step in your computation ... }
* Using multi-threaded programming could also achieve this... perhaps you could make a timer thread
which would halt for at least 4 seconds and then set a shared executing variable to false
ASKER
Could anyone give me some help on setting up signal handler and using alarm(). I have just realised that the busy loop will not work in this case as I do need my program to be able to continue doing something else as Mysidia pointed out.
In unix... suppose you want to delay for 4 seconds and then send signal SIGALRM
#include <unistd.h>
#include <signal.h>
int timed_executing = true;
void alarm_timer(int signal_num)
{
timed_executing = false;
}
signal(SIGALRM, alarm_timer); /* <-- register the signal handler to be called when SIGALRM is received */
...
alarm(4); /* <-- resets the timer to 4 seconds and starts it */
/* code to run */
alarm(0); /* <-- stops the timer without raising the signal */
signal(SIGALRM, SIG_DFL); /* <-- de-register the signal handler, setting SIGALRM back to Defaults */
#include <unistd.h>
#include <signal.h>
int timed_executing = true;
void alarm_timer(int signal_num)
{
timed_executing = false;
}
signal(SIGALRM, alarm_timer); /* <-- register the signal handler to be called when SIGALRM is received */
...
alarm(4); /* <-- resets the timer to 4 seconds and starts it */
/* code to run */
alarm(0); /* <-- stops the timer without raising the signal */
signal(SIGALRM, SIG_DFL); /* <-- de-register the signal handler, setting SIGALRM back to Defaults */
timer(int seconds)
{
time_t t;
for (t= time(NULL); time(NULL)-t > 4000; );
}
Or if your are using windows environment you can use Sleep(4000);