2016-04-12 20 views
0

自分自身をゼロにリセットするタイマーを書き込む必要があります。例えば、私はそれが満了する前に何かが起こった場合にだけ、私は同じタイマーを、新しい再ときのように、0から、タイマーはそれが持っているすべてのデータを消去し、再計算し、その後、ゴールンタイマーはゼロから再計算する

trm := time.NewTimer(10) 

を持っています。

私はGoの時間APIをチェックして何も見つかりませんでした。任意のヒント?

ありがとうございました。

+0

あなたはgo APIをチェックして何も見つからないということを意味しますか? google "golang timer"の最初の結果は、golangの時間パッケージの公式標準ライブラリドキュメントです。 'Timer'型は2つのメソッドしかありません。そのうちの1つは' Reset'です。それはまさにあなたが望むものではありませんか? –

答えて

1

timer.Reset機能を使用すると、タイマーをリセットできます。それを更新するには、最初はパラメータとして使用したのと同じ継続時間を渡します。パッケージのドキュメントから

10あなたのケースでは):

リセット持続時間Dの後に期限が切れるようにタイマーを変更します。タイマーがアクティブだった場合はtrueを返し、タイマーが期限切れになった場合や停止した場合はfalseを返します。

したがって、同じ継続時間をResetに渡すと、タイマーはその期間dからカウントを開始します。そして、あなたは事実上renewタイマーです。例えば

if eventHappened { 
    timer.Reset(10) 
} 
+0

Reset()が0から開始するか、タイミングを続けるかわかりません。 – fding

+0

@fding私はあなたの懸念に対処するために、答えを更新しました。 – desaiparth

0

time.Resetを使用するのはどう?

リセットは、期間dの後に期限切れになるようにタイマーを変更します。 タイマーがアクティブだった場合はtrueを返し、タイマーが期限切れになった場合はfalseを返し、 が停止した場合はfalseを返します。

別の解決策は、別のタイマーを初期化することです。

t.Reset(x) 
t := time.NewTimer(x) 

は、ガベージコレクションを避ける以外は同じです。

典型的な例は次のとおりです。経過時間がタイムアウトよりも小さい場合は、タイマーをリセットします。

package main 

import (
    "fmt" 
    "math/rand" 
    "time" 
) 

func main() { 
    const timeout = 1 * time.Millisecond 
    t := time.NewTimer(timeout) 
    for { 
     t2 := timeout + time.Duration(rand.Intn(100)-50)*timeout/100 
     start := time.Now() 
     select { 
     case <-time.After(t2): 
      fmt.Println("Time after:", t2) 
     } 
     elapsed := time.Since(start) 
     if elapsed < timeout { 
      fmt.Println("Time ellapsed:", elapsed) 
      t.Reset(timeout) 
     }   
    } 
} 
関連する問題