[C] Timer im Hintergrund

fish-guts

Erfahrenes Mitglied
Hallo

Ich versuche, einen Timer zu erstellen, der folgendes macht:

1. Der Timer wird gestartet, aber das Programm läuft ganz normal weiter.
2. Alle N Sekunden soll ein Befehl ausgeführt werden.
3. Wenn eine Kondition X wahr wird, soll der Timer aufhören.

Da das Programm weiterlaufen soll, kommt sleep() nicht in Frage. Ist signal() eine Option?

Der Timer soll sowohl unter UNIX als auch Windows laufen (auch wenn ich mit #ifdef _WIN32, etc. Weichen stellen muss).

Ist es möglich, in C so etwas zu realisieren? Ich habe dabei an einen globalen Counter gedacht, aber ich komme mit dem Aufruf nicht so zurecht.

Kann mir einer helfen? Vielen Dank :)

Gruss

FG
 
Hallo,

für Linux kann ich dir eine Demo zeigen:

C:
#include <sys/time.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>

#ifndef _WIN32
void
timer_event_handler (int sigid)
{
  printf ("Timer expired!\n");
}
#else
  #error "Implement windows timer handler
#endif

void
set_timer (time_t period_in_secs)
{
#ifndef _WIN32
  struct itimerval timer_val;

  bzero (&timer_val, sizeof(timer_val));
  timer_val.it_value.tv_sec = period_in_secs;
  timer_val.it_interval.tv_sec = period_in_secs;
  if (setitimer (ITIMER_REAL, &timer_val, NULL) != 0)
    perror ("Error in setitimer()");
#else
  #error "Implement windows timer programing"
#endif
}

int
main (int argc, char **argv)
{
#ifndef _WIN32
  if (signal (SIGALRM, timer_event_handler) == SIG_ERR)
    {
      fprintf (stderr, "Error in signal()\n");
      return 1;    
    }
#else
  #error "Implement windows timer registration"
#endif

  while (1)
    {
      char input;
      printf ("Activate timer [y|n]?:");
      scanf ("%c", &input);
      if (input == 'y')
	    set_timer (1);
      else
	    set_timer (0);
      while ((input = getchar ()) != '\n' && input != EOF);
    }

  return 0;
}

siehe
Code:
man setitimer
man signal

mit der Windows API kenn ich mich leider nicht aus. Aber evtl. findet sich hier im Forum dazu was?

Gruß,
RedWing
 
Zuletzt bearbeitet:
Hallo

Super, das hilft mir wirklich weiter. Vielen vielen dank.

Hatte vorher eben noch nie mit signals() gearbeitet, daher kannte ich das nicht.

Problem (vorerst) behoben :)

Gruss

FG
 
Zurück