QNetworkAccessManager
可以异步执行请求,time.sleep(secs)
可以暂停执行给定的秒数。我对以下代码感到困惑。这里的t2
总是大于10秒吗?
在此处的代码中未使用time.sleep(secs)
,已完成的广告位getWebPageSRC
在固定的时间内被调用,大约约3秒。
我现在已经测试了几次,发现t2总是大于10秒。任何人都可以解释原因吗?
de myMethod(self):
...
reply.finished.connect(self.getWebPageSRC)
self.t=time.clock()
time.sleep(10)
def getWebPageSRC(self):
t2=time.clock()-self.t
print(t2)
P.S。由于QNAM异步地工作,我认为它在另一个线程中工作,因此有自己的事件循环,time.sleep(secs)是否暂停所有线程的所有Qt事件循环或只是它内部线程的事件循环?在主线程中休眠会挂起所有其他线程的事件循环吗?
答案 0 :(得分:4)
这个问题似乎是理论,因为它应该永远不会成为实践中的一个问题,因为它闻起来像鱼腥设计或快速解决错误。
话虽如此,原因相对简单:当你开始睡觉时,Qt事件循环无法正常工作,因此在你从阻塞睡眠中醒来之前,事件循环无法从事件队列中处理你的插槽。
如果你睡在另一个线程中,这不会成为一个问题,尽管一开始就算是过于奇怪,但是在这里你睡觉的是线程(块)异步处理事件。 / p>
毕竟在Qt应用程序中睡觉没有多大意义。 Qt主要用于异步操作,尤其是像QtNetwork这样的QIODevice接口。
使用Qt 时,忘记此声明是否存在:
time.sleep(10)
每当您考虑阻止等待回复时,您都可以使用同步API,尽管即使是完全同步也不公平:
# 10000 msecs = 10 secs
myNetworkReply.waitForBytesWritten(10000)
我甚至可能会更进一步:我可能会避免在python应用程序中使用Qt而不是严格的UI。也就是说,所有其余的都可以通过python方式实现,通常更好,更容易从python应用程序。我认为你应该专注于GUI,但这肯定是基于意见的。相关的替代品将是asyncore,twisted等。
答案 1 :(得分:3)
无论QNAM异步地执行其工作,它仍然在主线程中运行。停止主线程10秒也阻止了QNAM。
答案 2 :(得分:2)
QNetworkAccessManager
可以异步执行请求,但它们都在应用程序主线程中执行,这是真的。所以当你打电话时
time.sleep(10)
主线程被阻止10秒,在此阻塞期间没有其他任何操作。这是因为QNetworkAccessManager
不在其他帖子中。