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?
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
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