Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    99

    [C] attendere mezzo secondo

    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
    codice:
    sleep(0.5)
    aspetta un tempo molto lungo, oppure non parte neanche (non ho aspettato abbastanza a lungo per vederlo partire), se invece uso
    codice:
    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

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    codice:
    #include <time.h>
    void sleep(double sleeptime) {
      time_t start = time(NULL);
      while(difftime(time(NULL), start) < sleeptime);
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    99
    ok grazie

  4. #4

    Re: [C] attendere mezzo secondo

    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
    "Memento audere semper"

    IBM Europe - Italy Group

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    99
    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

  6. #6
    Originariamente inviato da Scara95
    codice:
    #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...

    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:
    codice:
    #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
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Infatti come riportato Qui
    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 , mentre con queryPerformanceFrequency leggi la frequenza della CPU)

  8. #8
    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).
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    99
    a quanto ho capito quindi sarebbe più consigliato usare Sleep/usleep, grazie delle risposte e delle dritte

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.