[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 366
  • 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 OlivaresCommented:
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 OlivaresCommented:
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
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
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

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

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