Domanda

Di recente ho scritto un programma in C ++ che i ping tre diversi siti web e poi a seconda passaggio o non sarà attendere 5 minuti o 30 secondi prima che si tenta di nuovo.

Al momento sono stato utilizzando la libreria ctime e la seguente funzione per elaborare la mia attesa. Tuttavia, secondo il mio metro CPU questa è una soluzione inaccettabile.

void wait (int seconds)
{
   clock_t endwait;
   endwait = clock () + seconds * CLOCKS_PER_SEC;
   while (clock () < endwait) {}
}

Il motivo per cui questa soluzione è inaccettabile è perché secondo il mio metro di CPU il programma viene eseguito al 48% al 50% della mia CPU durante l'attesa. Ho un Athlon 64 X2 processore da 1,2 GHz. Non c'è alcun modo il mio programma linea modesto 130 dovrebbe anche arrivare vicino al 50%.

Come posso scrivere la mia funzione di attesa di meglio in modo che è solo utilizzando risorse minime?

È stato utile?

Soluzione

Per rimanere portatile è possibile utilizzare Boost :: Discussione per dormire:

#include <boost/thread/thread.hpp>

int main()
{
    //waits 2 seconds
    boost::this_thread::sleep( boost::posix_time::seconds(1) );
    boost::this_thread::sleep( boost::posix_time::milliseconds(1000) );

    return 0;
}

Altri suggerimenti

Con il C ++ 11 di serie il seguente approccio può essere utilizzato:

std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::this_thread::sleep_for(std::chrono::seconds(100));

In alternativa potrebbe essere usato sleep_until.

sonno piuttosto che un vuoto mentre ciclo.

Proprio per spiegare quello che sta succedendo: quando si chiama l'orologio () il programma recupera ancora una volta il tempo: si sta chiedendo di farlo il più velocemente si può fino a raggiungere l'endtime ... che le foglie core della CPU che esegue il programma di "spinning" veloce come si può attraverso il vostro ciclo, leggendo i milioni di tempo di volte al secondo, nella speranza che ti hanno rotolato verso la fine dei tempi. Dovete dire invece il sistema operativo che si desidera essere svegliati dopo un intervallo ... poi si può sospendere il suo programma e lasciare che gli altri programmi eseguiti (o il sistema di inattività) ... questo è ciò che le varie funzioni del sonno detto in altre le risposte sono per.

C'è Dormire in windows.h, su * nix non c'è sonno in unistd.h.

C'è una soluzione più elegante @ http: // www.faqs.org/faqs/unix-faq/faq/part4/section-6.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top