...a chi hai detto pazzo? |
- sleep(): è Ok ma ha una risoluzione troppo bassa: un secondo per alcune applicazioni è una eternità.
- usleep(): è obsoleta: è stata bannata dagli standard Posix perché ha una risposta ai segnali indefinita.
- nanosleep() è Ok (alta risoluzione, tratta i segnali) ma ha una interfaccia un poco ostica...
Vai col codice!
#include <stdio.h> #include <stdlib.h> #include <time.h> // prototipi locali static void mySleep(long msec); static char *getDateUsec(char *date); // main del programma di test int main(int argc, char **argv) { // test argomenti if (argc != 1) { // error printf("Usage: %s\n", argv[0]); return EXIT_FAILURE; } // mostra l'ora, sleep e mostra di nuovo l'ora char date[32]; printf("ora prima della sleep: %s\n", getDateUsec(date)); mySleep(1500); printf("ora dopo la sleep: %s\n", getDateUsec(date)); // esce con Ok return EXIT_SUCCESS; } // mySleep - sleep per un numero specifico di millisecondi void mySleep( long msec) // sleep time in millisecondi { // split argomento in secondi e millisecondi (msec è in millisecondi ma potrebbe essere > 1000) unsigned int seconds = msec / 1000; unsigned int milliseconds = msec % 1000; // set dati per nanosleeep() e li usa struct timespec t; t.tv_sec = seconds; t.tv_nsec = milliseconds * 1000000; // i.e.: tv_nsec=500000000; 500 milioni di ns è 1/2 sec nanosleep(&t, NULL); } // getDateUsec - ottiene date-time con i microsecondi char *getDateUsec( char* date) // stringa destinazione { ... }E, come sempre:
- Codice auto-esplicativo, ampiamente commentato e... i commenti parlano da soli.
- Il main() serve solo a lanciare la mySleep() e a mostrarci (con i dati del tempo prima e dopo) che la funzione funziona.
Una ultima nota per gli (eventuali) precisini che leggendo il codice avranno pensato "ma lo split degli argomenti si poteva fare direttamente nelle assegnazioni a struct timespec t, risparmiando le (ben) due istruzioni di assegnazione precedenti...". Beh non perdo neanche tempo a discutere e li invito solo a riflettere sui seguenti tre punti:
- mySleep() serve a ritardare: sai cosa ce ne importa dell'efficienza in questo caso...
- Leggetevi questo.
- "The real problem is that programmers have spent far too much time worrying about efficiency in the wrong places and at the wrong times; premature optimization is the root of all evil (or at least most of it) in programming" (D.Knuth, "Computer Programming as an Art", 1974).
gcc mysleep.c -o mysleep...uhmmm... devo ammettere che la citazione del mitico D.Knuth è la parte più interessante di tutto il post. Meditate gente, meditate...
Ciao e al prossimo post!
Complimenti per gli articoli, sarebbe interessante una collaborazione se ti interessa, anch'io sono un amante del C
RispondiEliminaGrazie per i complimenti.
Eliminammm... che tipo di collaborazione intendi?