Solved

How to create a timer in C that will execute some code when a particular amount of time has elapsed

Posted on 2004-09-19
8
297 Views
Last Modified: 2010-04-15
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
Comment
Question by:Broken_Arrow
  • 3
  • 2
  • 2
  • +1
8 Comments
 
LVL 55

Expert Comment

by:Jaime Olivares
Comment Utility
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
 
LVL 22

Expert Comment

by:grg99
Comment Utility
You can use signal() and alarm() or setitimer() to do this.  do a "man alarm"


0
 
LVL 55

Accepted Solution

by:
Jaime Olivares earned 200 total points
Comment Utility
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
 

Author Comment

by:Broken_Arrow
Comment Utility
I was just trying to figure out how it worked. Thanks I will give that a  go
0
IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 

Author Comment

by:Broken_Arrow
Comment Utility
Thanks that works perfect
0
 
LVL 23

Expert Comment

by:Mysidia
Comment Utility
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
 

Author Comment

by:Broken_Arrow
Comment Utility
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
 
LVL 23

Expert Comment

by:Mysidia
Comment Utility
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

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

Summary: This tutorial covers some basics of pointer, pointer arithmetic and function pointer. What is a pointer: A pointer is a variable which holds an address. This address might be address of another variable/address of devices/address of fu…
This is a short and sweet, but (hopefully) to the point article. There seems to be some fundamental misunderstanding about the function prototype for the "main" function in C and C++, more specifically what type this function should return. I see so…
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use for-loops in the C programming language.
The goal of this video is to provide viewers with basic examples to understand opening and reading files in the C programming language.

728 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now