2016-12-10 3 views
0

Dieser Code ruft eine Funktion alle 40 Sekunden innerhalb einer Schleife auf. Da time_t in meinem Linux-System angemeldet ist, bin ich über diesen Zustand zweifelhaft:Aufruf einer Funktion alle 40 Sekunden innerhalb einer While-Schleife

if ((time_left <= 0 || time_left > interval)) 

nur (time_left <= 0) fein prüft? Ich habe auf einige Websites verwiesen und sie haben auch einen Scheck für time_left > interval hinzugefügt. Ist diese Überprüfung erforderlich?

int print_timed_op() 
{ 
    time_t  time_now; 
    time_t  time_left; 
    time_t  time_next_interval; 
    int   interval = 40, hit_count =10; //40 second interval, 10 times 
    time_next_interval = time(0) + interval; 

    //tight loop 
    while (1) { 
     sleep(1); 
     time_now = time(0); 
     time_left = time_next_interval - time_now; 
     /* here time_left > interval check required ? */ 
     if ((time_left <= 0 || time_left > interval)) { 
       call_my_fuc(); 
       time_next_interval = time(0) + interval; 
       time_left = interval; 
       hit_count--; 
     } 

     if(hit_count <= 0) 
      break; 
    } 
    return 0; 
} 

Hinweis: Ich möchte keinen Linux-Timer-Systemaufruf oder eine andere Methode verwenden, um die Funktion regelmäßig aufzurufen.

+0

'time_left> interval' ist nur erforderlich in' time_t' ist vorzeichenlose ganze Zahl, aber es ist nicht, also 'time_left <= 0' sollte ausreichen –

+3

Warum können Sie nicht einfach 'while (1) {sleep (40); call_my_fuc();} '? (Sie könnten Ihre 'hit_count'-Prüfung einfügen, wenn Sie möchten.) – e0k

Antwort

2

Die Überprüfung für time_left > interval ist mit Uhr Änderungen oder Synchronisation zu tun. Wenn Ihr Intervall 40 Sekunden beträgt und jemand die Systemuhr aktualisiert, um sie um eine Stunde nach vorne zu verschieben, werden Sie 90 Aktualisierungen verpassen, wenn Sie diese Prüfung nicht durchführen.

Sie können dies genauer umgehen, indem Sie clock_gettime() mit der Option CLOCK_MONOTONIC verwenden. Dann wird die Zeit niemals vorwärts oder rückwärts springen, und Ihre Funktionsaufrufe werden immer gleichmäßig verteilt sein.

Verwandte Themen