Timer in C (like in Java)

Discussion in 'C Programming' started by Alexander Mahone, Apr 23, 2008.

  1. 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
    Alexander Mahone, Apr 23, 2008
    #1
    1. Advertising

  2. Alexander Mahone <> writes:
    > 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.

    --
    Keith Thompson (The_Other_Keith) <>
    Nokia
    "We must do something. This is something. Therefore, we must do this."
    -- Antony Jay and Jonathan Lynn, "Yes Minister"
    Keith Thompson, Apr 23, 2008
    #2
    1. Advertising

  3. Alexander Mahone

    santosh Guest

    Alexander Mahone wrote:

    > 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>
    santosh, Apr 23, 2008
    #3
  4. In article <funo2n$pu$>,
    santosh <> wrote:

    >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.
    --
    "Walter exemplified class." -- Paul Tagliabue
    Walter Roberson, Apr 23, 2008
    #4
  5. Alexander Mahone

    santosh Guest

    Walter Roberson wrote:

    > In article <funo2n$pu$>,
    > santosh <> wrote:
    >
    >>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.


    You're right. Apologies to the OP for mentioning an obsolescent
    function.
    santosh, Apr 23, 2008
    #5
  6. Alexander Mahone

    Anonymous Guest

    On Wed, 23 Apr 2008 21:58:05 +0530, santosh wrote:

    > 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.
    Anonymous, Apr 23, 2008
    #6
  7. Alexander Mahone

    jon Guest

    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
    jon, Apr 23, 2008
    #7
  8. In article <>,
    jon <> wrote:
    >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.
    --
    "Allegories are in the realm of thoughts, what ruins are in
    the realm of things." -- Walter Benjamin
    Walter Roberson, Apr 23, 2008
    #8
  9. -cnrc.gc.ca (Walter Roberson) writes:
    > In article <>,
    > jon <> wrote:
    >>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.


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

    --
    Keith Thompson (The_Other_Keith) <>
    Nokia
    "We must do something. This is something. Therefore, we must do this."
    -- Antony Jay and Jonathan Lynn, "Yes Minister"
    Keith Thompson, Apr 23, 2008
    #9
  10. On 23 Apr 2008 at 22:34, Keith Thompson wrote:
    > -cnrc.gc.ca (Walter Roberson) writes:
    >> 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.


    You're right, but there are also usleep and nanosleep, for shorter
    intervals.
    Antoninus Twink, Apr 24, 2008
    #10
  11. Alexander Mahone

    santosh Guest

    Antoninus Twink wrote:

    > On 23 Apr 2008 at 22:34, Keith Thompson wrote:
    >> -cnrc.gc.ca (Walter Roberson) writes:
    >>> 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.

    >
    > 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.
    santosh, Apr 24, 2008
    #11
  12. On 24 Apr 2008 at 19:17, santosh wrote:
    > 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.
    Antoninus Twink, Apr 24, 2008
    #12
  13. On 24 Apr, 22:08, Antoninus Twink <> wrote:
    > On 24 Apr 2008 at 19:17, santosh wrote:
    >
    > > 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
    Alexander Mahone, Apr 28, 2008
    #13
  14. Alexander Mahone

    santosh Guest

    Alexander Mahone wrote:

    > On 24 Apr, 22:08, Antoninus Twink <> wrote:
    >> On 24 Apr 2008 at 19:17, santosh wrote:
    >>
    >> > 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 <news:comp.unix.programmer> where you will surely
    receive much better responses than here. Standard C has no facilities
    for creating timers.
    santosh, Apr 28, 2008
    #14
  15. On 28 Apr 2008 at 13:21, Alexander Mahone wrote:
    > 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/).
    Antoninus Twink, Apr 28, 2008
    #15
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Kelsang Wangchuk

    System.Timers.Timer vs. System.Threading.Timer

    Kelsang Wangchuk, Jul 31, 2003, in forum: ASP .Net
    Replies:
    0
    Views:
    702
    Kelsang Wangchuk
    Jul 31, 2003
  2. Replies:
    1
    Views:
    1,574
    Steve C. Orr [MVP, MCSD]
    Feb 22, 2005
  3. Simon

    page timer, or redirect timer

    Simon, Nov 4, 2005, in forum: ASP .Net
    Replies:
    1
    Views:
    11,181
    Bruce Barker
    Nov 4, 2005
  4. Patrick Kowalzick
    Replies:
    5
    Views:
    457
    Patrick Kowalzick
    Mar 14, 2006
  5. Replies:
    8
    Views:
    477
    Jorgen Grahn
    Jul 15, 2013
Loading...

Share This Page