2016-03-22 11 views
0

秒の精度で2回の比較を試みていますが、コードの計算方法が異なり、比較が機能せず、ループが無限に実行されることがあります。私はあなたが時間と時間の長さを比較する他のより良い方法を持っている場合は、共有することができれば、私はそれをお願い申し上げ参照Pythonの継続時間の比較

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()) 

のために、以下の私のコードを貼り付けています。 GrabDuration & Grabtimeは、ユーザーが指定した変数です。あなたは開始時刻と終了時刻との間の比較を持っている場合のstart_timeが等しくない

をEND_TIMEする場合にのみ

答えて

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) 

、コードのこのwhileループは無限回実行されますが、その中にあなたが共有しているコードを、 whileループでは、現在のシステム時間をもう一度とり、比較のためにstrat_time変数を使用しません。それを確認してください。

また、datetime.datetime.now()。time()のようにdatetime.datetime.now()。time()メソッドを使用することもできます。< datetime.time(時= 2、分= 10、秒= 10) 。これはあなたの懸念を解決するのに役立ちます。

+0

ありがとう、あなたのスニペットは同じ問題を抱えていた、ここでは比較のプリントです。 Grabtimeのユーザー入力が2秒だったにもかかわらず、2〜3秒がスキップされるのがわかります。 2016年3月23日15時49分50秒= 2016年3月23日午後3時49分52秒 2016年3月23日午後03時49分53秒#3秒= 2016年3月23日15にスキップ: = 2016年3月23日49:52 2016年3月23日午後3時49分55秒#グッド = 2016年3月23日15時四十九分52秒 2016年3月23日午後03時49分57秒グッド# 15時49分52秒 2016年3月23日15時49分59秒グッド# = 2016年3月23日15時49分52秒 2016年3月23日夜03時50分〇二秒#悪い = 2016から03 -23 15:49:52 2016-03-23 15:50:04 #GOod = 20 16-03-23午前15時49分52秒 2016年3月23日午後三時50分06秒#Good = 2016年3月23日午後03時49分52秒 – tensingd1

1

私は基本的にはこのようなものだ、datetimenowは標準datetime.datetimeオブジェクトを返していると仮定している:それは時間のわずかな量を要するため==または!=datetimeオブジェクトの比較

from datetime import datetime 

def datetimenow(): 
    return datetime.now() 

は、それは少しトリッキーになり彼らは平等ではない。試験として

全く同じように入力し、そのdatetimenow()機能を呼び出すことが可能ですされている上記の行を想定した(PythonのREPLでこれらの行を試してください:あなたは、

datetimenow() == datetimenow() 

そして、それは、複数の試行の中でかなり可能です「少数False結果を得るでしょう

私はより安全な比較演算子、このようなものでdatetimeオブジェクトを比較することをお勧めしたい:。

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

おかげで、はいdatetimenow()関数は、標準の日時を返します。 datetimeオブジェクト。 それは難しいですが、私は時間が等しくなるまで、ループを実行したいループ。しかし、私が見つけたのは、end_timeがdatetimenow()にユーザ値を加えたものですが、scenerioは常にtrueではないということです。 ループは、いくつかの実行を意図して動作しますが、無限になるまで実行されることもあります。基本的には、現在の時間がユーザーが指定した時間に等しくなるまでループが実行され、秒まで正確でなければなりません。 – tensingd1

+0

プロセスを実行するのは一般的な要件ですが、一定の時間を超えないようにしてください。 '=='の代わりに '<='演算子を使って時間を比較すると、そのような要求に答えることができます。しかし、実際には、時間の経過に伴う制御(まだ、P)はありません。一定の時間処理する方法、具体的には処理にIOが含まれているかどうかはわかりません。時間の値を扱うときは、正確な比較を使用しない方が安全です。 – farzad

+0

ちょっとファザット、私は解決策を見つけた。ときどき間違った時間を与えるsleep()関数。受動的な時間カウンターやsleep()のような待機関数の代わりに、必要な秒ごとに待機するアクティブなwhileループを置き換えると、毎回正確な時刻を与える待機関数が得られます。 – tensingd1