【问题标题】:Python's time.sleep(1) finishes instantlyPython 的 time.sleep(1) 立即结束
【发布时间】:2019-11-29 05:26:55
【问题描述】:

我有一个执行以下操作的 python 函数:

  1. 启动一个新线程,并在其中运行 PyQt QApplication。
  2. 工作 N 秒,并将进度发送到运行 PyQt 的线程。

现在,在我启动 PyQt QApplication 之前,主线程中的 time.sleep() 按预期工作,但在我启动它之后,time.sleep(1) 立即返回。

这是一个例子:

 def run_gui_thread(self):
    app = QApplication([])
    self.prompt = QDialog()
    self.ready = True
    app.exec_()

还有:

def do_work(self):
    print "Now is %s." % time.strftime("%H:%M:%S")
    time.sleep(1)        
    print "Now is %s." % time.strftime("%H:%M:%S")
    time.sleep(1)        
    print "Now is %s." % time.strftime("%H:%M:%S")
    time.sleep(1)
    print "Now is %s." % time.strftime("%H:%M:%S")

    self.thread = threading.Thread(target = self.run_gui_thread)
    self.thread.start()

    time.sleep(1)
    print "Now is %s." % time.strftime("%H:%M:%S")        
    time.sleep(1)
    print "Now is %s." % time.strftime("%H:%M:%S")
    time.sleep(1)
    print "Now is %s." % time.strftime("%H:%M:%S")
    time.sleep(1)
    print "Now is %s." % time.strftime("%H:%M:%S")

输出:

Now is 10:00:56.
Now is 10:00:57.
Now is 10:00:58.
Now is 10:00:59.
Now is 10:00:59.
Now is 10:00:59.
Now is 10:00:59.
Now is 10:00:59.

有什么建议吗?

提前致谢。

【问题讨论】:

  • 作为一种快速破解方法,您可以尝试import select; select.select([], [], [], 1),看看它是否能更好地承受信号。

标签: python multithreading pyqt


【解决方案1】:

Qt 很可能在幕后使用信号(可能包括alarm())。根据time.sleep() doco:

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

您最好重新设计您的应用程序,以便您可以改用QTimer

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 2018-03-08
  • 1970-01-01
  • 2014-10-02
  • 2020-04-16
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多