0

我面临着我无法理解的行为。

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() 的建议?谢谢。

PS 没有诅咒 sleep() 工作正常。

4

2 回答 2

1

当您调整终端大小时,终端仿真器会向程序发送一个信号 ( SIGWINCH),使用它进行输入/输出。在您的示例中,这会中断time.sleep().

time.sleep()您可以使用 curses 函数napms()(等待给定的毫秒数) ,而不是 use 。

从您当前的程序开始,如果您将其打印出来,您可以更好地查看时间行为(改编来自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()

curses 具有类似睡眠的功能,但以毫秒为单位: napms。使用它,您将获得更一致的行为,因为 ncurses 处理SIGWINCH,根据需要重新启动napms获得请求的时间延迟。当我将其更改time.sleep(1)

    curses.napms(1000)

在调整终端大小时,程序会继续“休眠”一秒钟。

于 2017-04-23T00:37:30.450 回答
0

从以下文档time.sleep()

在给定的秒数内暂停当前线程的执行。该参数可以是一个浮点数,以指示更精确的睡眠时间。实际挂起时间可能少于请求的时间,因为任何捕获的信号都会在执行该信号的捕获例程后终止 sleep()。此外,由于系统中其他活动的调度,暂停时间可能比请求的时间长任意量。

于 2016-10-04T12:30:29.583 回答