2016-03-22 33 views
0

Bir saniyenin doğruluğu içinde iki kez karşılaştırmaya çalışıyorum, ancak kodun farklı hesapladığı bazı zamanları buluyorum ve karşılaştırmam işe yaramaz ve döngü sonsuz olarak yürütülür. Eğer zaman ve Paylaşabileceğin eğer bunu takdir ediyorum zaman süresini karşılaştıran başka daha iyi bir yolu varsa ben referansPython zaman aralığı karşılaştırması

start_time = datetimenow() #datetimenow is a function which returns time w/o microseconds    
end_time = start_time + timedelta(seconds = GrabDuration) 
while datetimenow() != end_time: #this part fails sometimes and passes sometimes 
    time.sleep(Grabtime) 
    saveas(imggrab()) 

için aşağıdaki kodumu yapıştırdınız. GrabDuration & Grabtime, süre için bir değişken verilen bir kullanıcıdır. Eğer başlangıç ​​zamanı ve bitiş zamanı arasında karşılaştırma varsa start_time eşit değil

END_TIME yalnızca

cevap

0
import datetime 
import time 
start_time = datetime.datetime.now() 
end_time = start_time + datetime.timedelta(seconds = GrabDuration) 
while start_time != end_time: 
    time.sleep(Grabtime) 

ardından bu kod ise döngü sonsuz kere çalıştırır Ancak ki paylaştığınız kod, Döngü tekrar mevcut sistem süresini alıyorsunuz ve karşılaştırmak için strat_time değişkenini kullanmıyorsunuz. Lütfen bunu kontrol et.

Ayrıca datetime.datetime.now(). Time() yöntemini datetime.datetime.now(). Time() < datetime.time (saat = 2, dakika = 10, saniye = 10) olarak da kullanabilirsiniz. . Bu endişelerinizi çözmenize yardımcı olabilir. Standart bir datetime.datetime nesneyi dönüyor ben datetimenow varsayıyorum

+0

teşekkürler, snippet'inizin aynı sorunu vardı, burada karşılaştırmanın baskısı var. Grabtime için kullanıcı girişi 2 sn olmasına rağmen, zamanın saniyede 3 saniyeye geçtiğini görebilirsiniz. 2016-03-23 ​​15:49:50 = 2016-03-23 ​​15:49:52 2016-03-23 ​​15:49:53 # 3 sn = 2016/03/23 15 geçildi: 49:52 2016-03-23 ​​15:49:55 # İyi = 2016-03-23 ​​15:49:52 2016-03-23 ​​15:49:57 # İyi = 2016/03/23 15:49:52 2016-03-23 ​​15:49:59 # İyi = 2016-03-23 ​​15:49:52 2016-03-23 ​​15:50:02 # Kötü = 2016-03 -23 15:49:52 2016-03-23 ​​15:50:04 #GOod = = 16-03-23 ​​15:49:52 2016-03-23 ​​15:50:06 #Good = 2016-03-23 ​​15:49:52 – tensingd1

1

, bu nedenle temel olarak bunun gibi:

from datetime import datetime 

def datetimenow(): 
    return datetime.now() 

== veya != biraz zor yapar ile datetime Nesne Karşılaştırma, zaman hafif bir miktar alır, çünkü onlar için eşit değil.

datetimenow() == datetimenow() 

Ve birden deneme arasındaki oldukça mümkündür, sizi: datetimenow() işlevi çağırmak için kullanılabilir böylece bir test sadece yukarıda yanı girilir çizgileri varsayarak bir Python Repl içinde bu satırları (denemek üzere

'bir kaç False sonuçlar elde edeceğiz

Ben daha güvenli karşılaştırma operatörleri, böyle bir şey ile datetime nesneleri karşılaştırmak öneririm:.

while datetimenow() <= end_time: 
    time.sleep(Grabtime) 
    saveas(imggrab()) 
+0

Teşekkürler ve evet datetimenow() işlevi standart bir tarih bilgisini döndürür. datetime nesnesi. Zor olan while döngüsü, zaman eşitlenene kadar döngü yürütmesini istiyorum. Ama bulduğum şey, end_time, datetimenow() plus kullanıcı değerinden türetilmiş olsa da, senaryo her zaman doğru değildir. Döngü, bazı çalışmalarda amaçlandığım gibi çalışır, ancak bazen sonsuza kadar yürütülür. Temel olarak, tüm bu döngü, şimdiki zaman kullanıcı tarafından belirtilen süreye eşit olarak yürütmek istiyorum ve saniyeler için doğru olmalıdır. – tensingd1

+0

Bir işlemi çalıştırmak için ortak bir gereksinimdir, ancak belirli bir süreden daha fazlasını almayacağından emin olun. '==' yerine zamanları karşılaştırmak için <= 'operatörünün kullanılması bu ihtiyacı karşılar. Fakat gerçekte zamanla kontrolümüz yoktur (yine de; P). İşlemin IO içermesi durumunda, belirli bir süre için tam olarak nasıl işlem yapmak istediğiniz açık değildir. Zaman değerleri ile çalışırken, kesin karşılaştırma kullanmamak daha güvenlidir. – farzad

+0

Hey Farzad, çözümü buldum. Bazen yanlış zamanlarını veren sleep() işlevi. Bir pasif zaman sayacı yerine ya da bekleme fonksiyonu gibi uyku() işlevini yerine getirerek, her bir saniye için beklemekte olan aktif bir süre döngüsü ile her seferinde tam zamanlı bir bekleme fonksiyonu elde edeceğiz. – tensingd1