[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 372
  • Last Modified:

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.
0
Broken_Arrow
Asked:
Broken_Arrow
  • 3
  • 2
  • 2
  • +1
1 Solution
 
Jaime OlivaresSoftware ArchitectCommented:
you must implement a function like this:

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);
0
 
grg99Commented:
You can use signal() and alarm() or setitimer() to do this.  do a "man alarm"


0
 
Jaime OlivaresSoftware ArchitectCommented:
sorry, about my "timer" function, there is a mistake. I will perfect it:

timer(int seconds)
{
   time_t   t = time(NULL) + seconds;

   while (time(NULL)<t)  {
       /* do nothing */
   };
}

0
Live webcast with Pinal Dave

Pinal Dave will teach you tricks to help identify the real root cause of database problems rather than red herrings. Attendees will learn scripts that they can use in their environment to immediately figure out their performance Blame Shifters and fix them quickly.

 
Broken_ArrowAuthor Commented:
I was just trying to figure out how it worked. Thanks I will give that a  go
0
 
Broken_ArrowAuthor Commented:
Thanks that works perfect
0
 
MysidiaCommented:
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

0
 
Broken_ArrowAuthor Commented:
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.

0
 
MysidiaCommented:
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 */

0

Featured Post

Live webcast with Pinal Dave

Pinal Dave will teach you tricks to help identify the real root cause of database problems rather than red herrings. Attendees will learn scripts that they can use in their environment to immediately figure out their performance Blame Shifters and fix them quickly.

  • 3
  • 2
  • 2
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now