PDA

Visualizza la versione completa : [C] attendere mezzo secondo


glukosio
20-01-2013, 12:39
ciao a tutti, ho bisogno di fermare il tempo in un'iterazione per mezzo secondo, cioè 500ms.
fino ad adesso ho usato sleep(), che però funziona in secondi, e se metto
sleep(0.5) aspetta un tempo molto lungo, oppure non parte neanche (non ho aspettato abbastanza a lungo per vederlo partire), se invece uso
sleep(1/2) va troppo veloce.
ho letto in giro della funzione delay() che lavora in millisecondi però il compilatore mi dice che non esiste :(
ho provato ad usare un ciclo for vuoto iterato per qualche milione di volte, ma credo che occupi troppa cpu.
esiste qualcosa che può aiutarmi?
grazie in anticipo :D

Scara95
20-01-2013, 13:09
#include <time.h>
void sleep(double sleeptime) {
time_t start = time(NULL);
while(difftime(time(NULL), start) < sleeptime);
}

glukosio
20-01-2013, 13:14
ok grazie

Hard*RTOS
20-01-2013, 14:09
Originariamente inviato da glukosio
ho letto in giro della funzione delay() che lavora in millisecondi però il compilatore mi dice che non esiste :(
ho provato ad usare un ciclo for vuoto iterato per qualche milione di volte, ma credo che occupi troppa cpu.

Lascia perdere i cicli iterativi, e sfrutta ciò postato da Scara95; voglio solo precisare che - per utilizzare la delay - devi includere nell'header dos.h.

Ciao :)

glukosio
20-01-2013, 14:17
avevo già incluso dos.h ma nulla, comunque ho fatto un po' di ricerche e ho trovato la funzione Sleep(), che ha differenza di sleep() calcola in millisecondi, però non so se funziona anche su linux, li in quel caso userò il metodo di Scara95

MItaly
20-01-2013, 14:22
Originariamente inviato da Scara95

#include <time.h>
void sleep(double sleeptime) {
time_t start = time(NULL);
while(difftime(time(NULL), start) < sleeptime);
}
Questa roba divora la CPU, e tra l'altro la time normalmente non ha abbastanza risoluzione per lavorare con intervalli inferiori al secondo... :stordita:

Il modo "giusto" è usare la Sleep su Windows e la usleep su Linux/sistemi POSIX; puoi "condensare" i due approcci in una sola funzione con qualche trucco di preprocessore:


#if defined(_WIN32)
#include <windows.h>
#elif defined(_POSIX_VERSION)
#include <unistd.h>
#endif

void sleep_msec(unsigned int msec)
{
#if defined(_WIN32)
Sleep(msec);
#elif defined(_POSIX_VERSION)
usleep(msec*1000u);
#else
#error Unsupported OS.
#endif
}

MegaAlchimista
20-01-2013, 15:00
Infatti come riportato Qui (http://en.cppreference.com/w/cpp/chrono/c/time)

The encoding of calendar time in std::time_t is unspecified, but most systems conform to POSIX specification and return a value of integral type holding the number of seconds since the Epoch. Implementations in which std::time_t is a 32-bit signed integer (many historical implementations) fail in the year 2038.
Time ha una precisione di un secondo, quindi se si vogliono risoluzioni in termine di frazioni di secondo bisogna per forza appoggiari al proprio sistema operativo (magari prendendo direttamente il time stamp della CPU, che per la cronaca in windows è questo (http://msdn.microsoft.com/it-it/library/windows/desktop/ms644904(v=vs.85).aspx) , mentre con queryPerformanceFrequency (http://msdn.microsoft.com/it-it/library/windows/desktop/ms644905(v=vs.85).aspx) leggi la frequenza della CPU)

MItaly
20-01-2013, 15:33
Sì, ma in ogni caso un "busy waiting" come quello proposto sopra, a meno che non sia richiesta una grande precisione, non è una buona idea su sistemi operativi multitasking, dato che un ciclo del genere divora la CPU invece di lasciarla libera per altri thread/processi (cosa che invece accade con le varie sleep).

glukosio
20-01-2013, 16:05
a quanto ho capito quindi sarebbe più consigliato usare Sleep/usleep, grazie delle risposte e delle dritte :D

Loading