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)由于QNAM异步工作,我认为它在另一个线程中工作,因此它有自己的事件循环,那么time.sleep(secs)是否挂起所有线程的所有Qt事件循环,或者仅仅挂起它内线程的事件循环?睡在主线程中是否挂起所有其他线程的事件循环?
发布于 2014-12-21 15:01:44
这个问题似乎是理论性的,因为它不应该成为实践中的一个关注,因为这闻起来像是可疑的设计或快速解决一个错误。
话虽如此,原因还是相对简单的:当您开始睡觉时,Qt事件循环无法完成它的工作,因此在您从阻塞睡眠中醒来之前,事件循环无法从事件队列中处理您的插槽。
如果您睡在另一个线程中,这将不是一个问题,尽管这在一开始也会非常奇怪,但是在这里,您睡在应该异步处理事件的线程(块)中。
毕竟,在Qt应用程序中睡眠没有多大意义。Qt主要用于异步操作,特别是QIODevice接口(如QtNetwork )。
当使用Qt时,忘记了这个语句的存在
time.sleep(10)每当您考虑阻止等待回复时,您都可以使用同步API,尽管为了公平起见,即使这样也不是完全同步:
# 10000 msecs = 10 secs
myNetworkReply.waitForBytesWritten(10000)我可能会更进一步:在python应用程序中,除了严格意义上的UI之外,我可能会避免使用Qt。也就是说,所有其他的都可以通过python方法来实现,通常从python应用程序中可以更好、更容易。我认为您应该关注GUI,但这在某种程度上是基于观点的。相关的替代方案将是异步、扭曲等。
发布于 2014-12-21 15:02:36
不管QNAM异步地执行其工作,它仍然在主线程中运行。停止主线程的10s块QNAM也。
发布于 2014-12-21 15:02:00
的确,QNetworkAccessManager可以异步执行请求,但它们都在应用程序主线程中执行。所以当你打电话
time.sleep(10)主线程被阻塞10秒,在此阻塞期间,没有其他任何操作。这是因为这里的QNetworkAccessManager不在其他线程中。
https://stackoverflow.com/questions/27590512
复制相似问题