2016-06-08 19 views
5

Yarım milisaniye hassasiyetle doğru sırayla çalıştırmak gerekir görevleri planlamak için Go time.Timer s kullanmaya çalışıyorum üzerinde Git (milisaniye hassasiyet). Bu OSX ve Linux üzerinde mükemmel çalışıyor, ancak Windows'ta her zaman başarısız oluyor.Yüksek çözünürlüklü zamanlayıcılar, Windows

Aşağıdaki kod sorunu göstermektedir. 5 zamanlayıcıyı, ilkini 1 ms'ye, ikincisini 2 ms'ye ... ve sonuncuyu 5 ms'ye ayarlar. Bir zamanlayıcı patladığında, numarası yazdırılır. OSX ve Linux'ta bu, çıktı olarak "12345" üretti, ancak Windows'da sayılar az ya da çok rasgele (Win 7 ve Windows Server 2012'de test edildi).

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 
    var timer1, timer2, timer3, timer4, timer5 *time.Timer 

    timer1 = time.NewTimer(1 * time.Millisecond) 
    timer2 = time.NewTimer(2 * time.Millisecond) 
    timer3 = time.NewTimer(3 * time.Millisecond) 
    timer4 = time.NewTimer(4 * time.Millisecond) 
    timer5 = time.NewTimer(5 * time.Millisecond) 

    // should print 12345 
    for { 
     select { 
     case <-timer1.C: 
      fmt.Print("1") 
     case <-timer2.C: 
      fmt.Print("2") 
     case <-timer3.C: 
      fmt.Print("3") 
     case <-timer4.C: 
      fmt.Print("4") 
     case <-timer5.C: 
      fmt.Print("5") 
     case <-time.After(200 * time.Millisecond): 
      return // exit the program 
     } 
    } 
} 

Ben de daha kısa aralıklarla meydana gelmiş olmalıdır rağmen bu davranış Windows zamanlayıcı hassas 16 ms 1 ms indirildiği Go 1.6 (https://golang.org/doc/go1.6#runtime, 4 paragraf), yapılan değişiklikler nedeniyle olduğunu düşünüyorum Daha önce (100 orders).

1 ms geri küresel, Windows zamanlayıcı hassasiyet sıfırlamak için, ya da iş Yukarıdaki örneği yapacak bir yüksek çözünürlüklü zamanlayıcı erişmek için herhangi bir yolu var mı?

+3

Geçerli davranış go1.7rc nedir? Windows zamanlayıcıları performanslarından dolayı daha fazla değişiklik oldu. GH'deki birçok zamanlayıcı ile ilgili konuları okumak isteyebilirsiniz. – JimB

+0

Zamanlayıcılar, Go 1.7'nin mevcut beta sürümü ile daha yüksek bir çözünürlüğe sahip gibi görünüyor. Yardım ettiğin için teşekkür ederim. – m4r73n

+1

Muhtemelen bunu bir cevap olarak eklemeniz ve ondan memnun olmanız halinde kabul edildi olarak işaretlemeniz iyi bir fikirdir. Sonra cevapsız soruları cevaplamak isteyen insanlar bunu atlayabilir. – ijt

cevap

0

Git 1.7'den beri, zamanlayıcılar artık daha yüksek bir çözünürlüğe sahip ve bu sorun oluşmamalıdır.

İlgili konular