2016-10-04 11 views
0

私は理解できない動作に直面しました。端末のサイズが変更されたときにcursesがtime.sleep()を破る

import curses 
import time 

myscreen = curses.initscr() 

y, x = myscreen.getmaxyx() 
i = 0 

while y >= 24 and x >= 80 and i <= 23: 
    myscreen.addstr(i, 0, 'Python curses in action!') 
    myscreen.refresh() 
    y, x = myscreen.getmaxyx() 
    i += 1 
    time.sleep(1) 

curses.endwin() 

このコードでは、1秒間隔で24個の文字列が書き込まれます。これは問題ありません。 しかし、実行中にターミナルウィンドウのサイズを変更すると、文字列が画面上にはるかに速く表示され、次に1文字/秒が表示されます。 この動作を説明し、おそらく私のtime.sleep()を「保護する」方法をアドバイスしてもらえますか?おかげさまで

P.S. curses sleep()は問題なく動作します。 time.sleep()のドキュメントから

答えて

0

は 与えられた秒数の間、現在のスレッドの実行を一時停止します。引数は、より正確な睡眠時間 を示す浮動小数点数です。 キャッチされたシグナルは、そのシグナルのキャッチルーチンの実行後にsleep() を終了するため、要求された実際の中断時間は より小さくなることがあります。また、 の停止時間は、システム内の他のアクティビティのスケジューリングのために、任意の金額 の要求より長くなることがあります。

0

端末エミュレータは、端末のサイズを変更すると、入力/出力用のプログラムに信号(SIGWINCH)を送信します。あなたの例では、それはtime.sleep()を中断します。

time.sleep()を使用するのではなく、curses関数napms()(指定されたミリ秒の待機時間)を使用できます。

あなたは(Get current time in milliseconds in Python?からの回答を適応させる)、それをプリントアウトした場合、あなたの現在のプログラムから始めて、あなたは良い時間行動を見ることができます:

import curses 
import time 
from datetime import datetime 
from datetime import timedelta 

start_time = datetime.now() 

# returns the elapsed seconds since the start of the program 
def elapsed(): 
    dt = datetime.now() - start_time 
    ms = (dt.days * 24 * 60 * 60 + dt.seconds) * 1000 + dt.microseconds/1000.0 
    return ms/1000.0 

myscreen = curses.initscr() 

y, x = myscreen.getmaxyx() 
i = 0 

while y >= 24 and x >= 80 and i <= 23: 
    myscreen.addstr(i, 0, 'Python curses in action ' + "%.3f" % elapsed()) 
    myscreen.refresh() 
    y, x = myscreen.getmaxyx() 
    i += 1 
    time.sleep(1) 

myscreen.getch() 
curses.endwin() 

呪い睡眠のような機能を持っていますが、でミリ秒napms。 ncursesは要求された時間遅延を得るために、SIGWINCHrestartingnapmsを必要に応じて処理するので、より一貫した動作が得られます。私は、端末のサイズが変更されている間time.sleep(1)

curses.napms(1000) 

へのプログラムは1秒間「スリープ」に続けていることを変更した場合。

関連する問題