2010-03-20 13 views
5

C'è una riga nel terzo tutorial su Boost asio che mostra come rinnovare un timer e tuttavia impedire che ci sia una deriva. La linea è la seguente:Hai bisogno di spiegazioni per questo potenziamento :: esempio di temporizzatore asio

t->expires_at(t->expires_at() + boost::posix_time::seconds(1)); 

Forse è me, ma io non sono riuscito a trovare la documentazione al 2 ° utilizzo di e xpires_at(), senza parametri. expires_at(x) imposta la nuova scadenza, annullando eventuali gestori di completamento in sospeso. Quindi presumibilmente expires_at() fa cosa, restituisce il tempo dell'ultima scadenza? Quindi aggiungendo un secondo, se ci dovrebbe essere un certo numero di ms, diciamo n ms, allora sarà essenzialmente "sottratto" dalla prossima scadenza dal momento in cui viene calcolato il tempo? Cosa succede se il tempo impiegato per eseguire questo gestore è maggiore di 1 secondo in questo esempio? Spara immediatamente?

risposta

2

expires_at() restituisce l'ora quando è impostata su timeout. Quindi questo sposterà il timeout a 1 secondo dopo.

Quando si imposta il tempo con expires_at (x) si otterrà un ritorno di 0 se già invocato a causa del tempo già trascorso. Se il rendimento è maggiore allora 0 indica il numero di cancellazioni che sono state fatte.

+0

Non sono sicuro di aver capito la tua prima frase. expires_at() restituisce un tempo posix (in questo caso posix). ma in questa riga di codice viene eseguito * all'interno * del gestore di completamento, quindi la scadenza è nel passato (è appena successo un momento fa). Quindi, se capisco l'effetto è che si aggiunge tempo in passato con 1 secondo, tenendo conto del tempo che si sta impiegando * ora * per eseguire il gestore di completamento (qualunque codice abbia preceduto questa linea). È così che la deriva viene evitata giusto? Altrimenti aggiungerai 1 secondo + il tempo impiegato per eseguire il codice precedente a questa linea? – ApplePieIsGood

+0

Questo aggiungerà 1 secondo al tempo in cui avrebbe dovuto richiamare il gestore. Quindi se hai un ritardo per qualche motivo prima di entrare nel gestore, è meno di un secondo prima che invochi di nuovo il gestore. O nel caso speciale lo metterà solo in coda perché dovrebbe essere già stato gestito, perché ci è voluto molto tempo per raggiungere questo codice. Se pensi che sia un grosso rischio 1s è troppo piccolo dovresti forse usare expires_from_now (x) invece di impostare 1s da ora. – jpyllman

Problemi correlati