2016-06-14 8 views
6

Sarei grato per alcuni suggerimenti su come riattivare periodicamente un thread C++ 11 (ad esempio ogni 100ms). La piattaforma è Linux e il linguaggio C++. Mi sono imbattuto in questa soluzione:Come riattivare periodicamente un thread C++ 11?

C++ 11: Calling a C++ function periodically

ma che chiamano una funzione di callback e poi dormire per l'intervallo del timer. Ciò significa che il periodo effettivo è il tempo di esecuzione della funzione + l'intervallo. Voglio chiamare la callback a intervalli costanti, indipendentemente dal tempo di esecuzione.

Mi chiedo se Boost potrebbe aiutare? Ma preferirei non usarlo, poiché questo progetto non è multipiattaforma e voglio minimizzare l'uso di librerie di terze parti.

Forse la combinazione di un timer POSIX con un thread C++ rappresenta una soluzione? Non sono sicuro di come funzionerebbe.

Sarebbe gradito qualsiasi suggerimento su come iniziare.

+0

controllo http://stackoverflow.com/questions/14832139/call- function-periodically-without-using-threads-and-sleep-method-in-c – kTT

+0

Questo è probabilmente quello che vuoi: https://stackoverflow.com/questions/37240834/how-can-we-make-a-loop -con-chronicle-statement-in-c/37241412 # 37241412 – Galik

risposta

1

Per un puro C++ approccio, senza funzioni specifiche di implementazione, è possibile creare una std::mutex e std::condition_variable, bloccare il mutex, quindi utilizzare wait_for() dormire sul condizionale, per 100 ms, o qualsiasi altro intervallo, nel tuo thread .

Per un controllo più preciso degli intervalli di sveglia, che tiene conto del tempo effettivo che il thread impiega per eseguire, tra le pause, utilizzare wait_until(), insieme a un orologio adeguato.

1

Chiamerei la funzione tramite std::async su un timer. Tuttavia, se la tua funzione impiega regolarmente più tempo del periodo, consumerai rapidamente risorse. Anche la creazione di una nuova discussione ha un costo relativamente costoso.

Quindi è possibile misurare la durata della funzione tramite std::chrono::high_resolution_clock e quindi utilizzare wait_for per interrompere il resto del periodo.

3

È necessario misurare il tempo impiegato dalla funzione per eseguire e quindi sospendere per il periodo meno il tempo di esecuzione. Utilizzare std::this_thread::sleep_for per dormire per il tempo che è trascorso. Ad esempio:

const auto timeWindow = std::chrono::milliseconds(100); 

while(true) 
{ 
    auto start = std::chrono::steady_clock::now(); 
    do_something(); 
    auto end = std::chrono::steady_clock::now(); 
    auto elapsed = end - start; 

    auto timeToWait = timeWindow - elapsed; 
    if(timeToWait > std::chrono::milliseconds::zero()) 
    { 
     std::this_thread::sleep_for(timeToWait); 
    } 
} 

NOTA: Se il compilatore lo supporta è possibile utilizzare 100ms piuttosto che std::chrono::milliseconds(100). Il mio non :-(

+0

OP indica che la durata di 'do_qualcosa 'dovrebbe essere parte di' 100ms'. – Jarod42

+0

Questo è ciò che l'OP vuole evitare .Vogliono un intervallo costante. – Galik

+0

Grazie. Ho aggiornato la risposta – Sean