Timer in C (like in Java)

A

Alexander Mahone

Hello, I need a facility in C, like a set of functions, to manage a
timer: I should be able to initialize it with a certain period of time
(like x msec), start it, and every x msec it should execute a certain
function. In a few words, I need something like the java.util.Timer
class, but for C (of course not a class).
Do you know of any implementation of something like that (if possible
real-time)?
Thanks a lot
 
K

Keith Thompson

Alexander Mahone said:
Hello, I need a facility in C, like a set of functions, to manage a
timer: I should be able to initialize it with a certain period of time
(like x msec), start it, and every x msec it should execute a certain
function. In a few words, I need something like the java.util.Timer
class, but for C (of course not a class).
Do you know of any implementation of something like that (if possible
real-time)?

Not in standard C. Try a newsgroup that deals with your operating
system.
 
S

santosh

Alexander said:
Hello, I need a facility in C, like a set of functions, to manage a
timer: I should be able to initialize it with a certain period of time
(like x msec), start it, and every x msec it should execute a certain
function. In a few words, I need something like the java.util.Timer
class, but for C (of course not a class).
Do you know of any implementation of something like that (if possible
real-time)?
Thanks a lot

Standard C has no facilities for what you want to do. However POSIX
specifies ualarm() and setitimer() for interrupting a process after a
specified period. A signal handler can then call your function.

<http://www.mkssoftware.com/docs/man3/ualarm.3.asp>
<http://www.mkssoftware.com/docs/man3/setitimer.3.asp>
 
W

Walter Roberson

santosh said:
Standard C has no facilities for what you want to do. However POSIX
specifies ualarm() and setitimer() for interrupting a process after a
specified period. A signal handler can then call your function.

Neither function was part of POSIX.1-1990.

ualarm() was added to POSIX as of Issue 4, Version 2, and moved from
X/OPEN UNIX extension to BASE of of issue 5 (which I think was 2002.)
As of issue 6 (2004), ualarm() is marked obsolescent.
http://www.opengroup.org/onlinepubs/000095399/functions/ualarm.html

setitimer() was also added and moved at the same issues as for ualarm(),
but setitimer() is not marked obsolescent.
http://www.opengroup.org/onlinepubs/009695399/functions/getitimer.html

For information about what the -recommended- POSIX timer functions are
and their various trade-offs, a unix programming newsgroup should
be consulted.
 
S

santosh

Walter said:
Neither function was part of POSIX.1-1990.

ualarm() was added to POSIX as of Issue 4, Version 2, and moved from
X/OPEN UNIX extension to BASE of of issue 5 (which I think was 2002.)
As of issue 6 (2004), ualarm() is marked obsolescent.
http://www.opengroup.org/onlinepubs/000095399/functions/ualarm.html

setitimer() was also added and moved at the same issues as for
ualarm(), but setitimer() is not marked obsolescent.
http://www.opengroup.org/onlinepubs/009695399/functions/getitimer.html

For information about what the -recommended- POSIX timer functions are
and their various trade-offs, a unix programming newsgroup should
be consulted.

You're right. Apologies to the OP for mentioning an obsolescent
function.
 
A

Anonymous

Standard C has no facilities for what you want to do. However POSIX
specifies ualarm() and setitimer() for interrupting a process after a
specified period. A signal handler can then call your function.

Only if you're really careful. Only some functions are safe to call in a
signal handler, or functions called from a signal handler. your system's
'man 7 signal()' should give you a list of safe functions to call from a
signal handler.

A unix newsgroup should give more information.
 
J

jon

there is a simple timer, but it works on the same process (which means
that the program will stop till the timer is done):

sleep(int amount_of_milliseconds);

in windows programing there are ways to create a separate process to
control the timer:

here is a link to a msdn site:

http://msdn2.microsoft.com/en-us/library/ms632592.aspx

(if it doesn't work, try searching (on the same page) for timers and
windows)

// Set two timers.

SetTimer(hwnd, // handle to main window
IDT_TIMER1, // timer identifier
10000, // 10-second interval
(TIMERPROC) NULL); // no timer callback

SetTimer(hwnd, // handle to main window
IDT_TIMER2, // timer identifier
300000, // five-minute interval
(TIMERPROC) NULL); // no timer callback
 
W

Walter Roberson

there is a simple timer, but it works on the same process (which means
that the program will stop till the timer is done):
sleep(int amount_of_milliseconds);

sleep() is not part of standard C. It is a common operating system
extension, but the original poster did not specify an OS.
 
K

Keith Thompson

sleep() is not part of standard C. It is a common operating system
extension, but the original poster did not specify an OS.

Furthermore, it's defined differently on different systems. On POSIX
systems, for example, the argument is a number of seconds.
 
A

Antoninus Twink

Furthermore, it's defined differently on different systems. On POSIX
systems, for example, the argument is a number of seconds.

You're right, but there are also usleep and nanosleep, for shorter
intervals.
 
S

santosh

Antoninus said:
You're right, but there are also usleep and nanosleep, for shorter
intervals.

I think the OP wants something that will interrupt the program
periodically. I think some versions of nanosleep will do this, but as
Walter Roberson has rightly observed, the OP is better of consulting in
a platform specific group. His best bet might be setitimer/getitimer or
the timer_* group of functions.
 
A

Antoninus Twink

Antoninus said:
You're right, but there are also usleep and nanosleep, for shorter
intervals.

I think the OP wants something that will interrupt the program
periodically. I think some versions of nanosleep will do this [snip]
His best bet might be setitimer/getitimer or the timer_* group of
functions.

Oops, sorry, I lost sight of what the OP had asked amidst all the
bluster.

Yes, setitimer should be just the ticket.
 
A

Alexander Mahone

I think the OP wants something that will interrupt the program
periodically. I think some versions of nanosleep will do this [snip]
His best bet might be setitimer/getitimer or the timer_* group of
functions.

Oops, sorry, I lost sight of what the OP had asked amidst all the
bluster.

Yes, setitimer should be just the ticket.

OK, I read various documentation on the Internet, but I think neither
ualarm() or setitimer() satisfy me completely. What I need to do, in
fact, is create a series of different timers, like timer objects, each
one referrable, with some kind of reference (a pointer or any other
way to refer to it in the future). Then, under certain conditions, I
need to reset one or more of them (that's why I need some way to refer
to every single timer specificly), to prevent them sending the
SIGALARM.
From what I've read, both ualarm() and setitimer() (the first of based
on the second) allows you to manage one single global timer, the one
of the caller process...
So, in my opinion (correct me if I'm wrong, my knownledge of C is
quite limited) the only 2 ways to do this would be:
1 - Create a series of threads, one for each timer I want to create,
and inside each thread call ualarm()...Or maybe I'd need to create
child processes, instead of threads?
2 - Use a series of timer_create(), without the need to create any per-
timer thread...
Is there a simpler and more lightweight way to do this?
Thanks a lot
 
S

santosh

Alexander said:
Antoninus Twink wrote:
You're right, but there are also usleep and nanosleep, for shorter
intervals.
I think the OP wants something that will interrupt the program
periodically. I think some versions of nanosleep will do this [snip]
His best bet might be setitimer/getitimer or the timer_* group of
functions.

Oops, sorry, I lost sight of what the OP had asked amidst all the
bluster.

Yes, setitimer should be just the ticket.

OK, I read various documentation on the Internet, but I think neither
ualarm() or setitimer() satisfy me completely. What I need to do, in
fact, is create a series of different timers, like timer objects, each
one referrable, with some kind of reference (a pointer or any other
way to refer to it in the future). Then, under certain conditions, I
need to reset one or more of them (that's why I need some way to refer
to every single timer specificly), to prevent them sending the
SIGALARM.
From what I've read, both ualarm() and setitimer() (the first of based
on the second) allows you to manage one single global timer, the one
of the caller process...
So, in my opinion (correct me if I'm wrong, my knownledge of C is
quite limited) the only 2 ways to do this would be:
1 - Create a series of threads, one for each timer I want to create,
and inside each thread call ualarm()...Or maybe I'd need to create
child processes, instead of threads?
2 - Use a series of timer_create(), without the need to create any
per- timer thread...
Is there a simpler and more lightweight way to do this?
Thanks a lot

Please ask this <where you will surely
receive much better responses than here. Standard C has no facilities
for creating timers.
 
A

Antoninus Twink

OK, I read various documentation on the Internet, but I think neither
ualarm() or setitimer() satisfy me completely. What I need to do, in
fact, is create a series of different timers, like timer objects, each
one referrable, with some kind of reference (a pointer or any other
way to refer to it in the future). Then, under certain conditions, I
need to reset one or more of them (that's why I need some way to refer
to every single timer specificly), to prevent them sending the
SIGALARM.
From what I've read, both ualarm() and setitimer() (the first of based
on the second) allows you to manage one single global timer, the one
of the caller process...

Well, you can squeeze out three, producing the different signals
SIGALRM, SIGVTALRM and SIGPROF, but yes, there's a strictly limited
number of timers available to each process.

The usual way around this is to implement multiple timers by hand: set
up an ordered queue of timers, and as one expires initialize the next
one along.

Of course, that's a pain, and so people have already done it and put it
into libraries for you to use - a good one is libevent
(http://monkey.org/~provos/libevent/).
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,048
Latest member
verona

Latest Threads

Top