Improve company productivity with a Business Account.Sign Up

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

C++ Simple Posix Timer

Hey guys,

What's the simplest bare bones method of creating a timer to handle this situation:

I have a program running that will always be getting messages and doing internal processing.  Every 10 seconds on top of this (or some other arbitrary number), I would like to get a signal from a timer which calls one of the methods on a singleton class within the program (just a callback really).

Anyway, I'm aware of the thread synch issues and all, but it's been a while since I've made a timer in a Unix/Linux environment so some code would be useful. :)

Thanks!

-w00te
0
w00te
Asked:
w00te
  • 2
1 Solution
 
jkrCommented:
You could use 'setitimer()', which would be used like follows (code taken from http://www.cs.uaf.edu/~olawlor/ref/examples/unix/setitimer.c - see also http://www.cs.uaf.edu/~olawlor/ref/examples/unix/setitimer_pc.c)
/* Orion Lawlor's Short UNIX Examples, olawlor@acm.org 2004/3/5

Shows how to use setitimer to get periodic interrupts.
*/
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
#ifdef SOLARIS /* needed with at least Solaris 8 */
#include <siginfo.h>
#endif

void printStack(const char *where) {
	printf("%s stack: %p\n",where,&where);
}

void signalHandler(int cause, siginfo_t *HowCome, void *ucontext) {
	printStack("signal handler");
}

int main(){ 
	int i;
	struct itimerval itimer;
	
/* Install our SIGPROF signal handler */
        struct sigaction sa;
	
        sa.sa_sigaction = signalHandler;
        sigemptyset( &sa.sa_mask );
        sa.sa_flags = SA_SIGINFO; /* we want a siginfo_t */
        if (sigaction (SIGPROF, &sa, 0)) {
		perror("sigaction");
		exit(1);
        }
	
	printStack("main routine");

/* Request SIGPROF */
	itimer.it_interval.tv_sec=0;
	itimer.it_interval.tv_usec=10*1000;
	itimer.it_value.tv_sec=0;
	itimer.it_value.tv_usec=10*1000;
	setitimer(ITIMER_PROF, &itimer, NULL); 
	
/* Just wait a bit, which should get a few SIGPROFs */
	for (i=0;i<1000*1000*10;i++) {
	}

        return(0);
}

Open in new window

0
 
simoespCommented:
You can do something like this:

while (true)
{
while (pendingEvents () )
handleEvens ();
sleep (10);
}
0
 
w00teAuthor Commented:
Thanks JKR - worked great.
0
 
w00teAuthor Commented:
Oh and thanks for the other answer too, I just didn't want to touch the sleep function if I didnt have to. :)
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

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