gpt4 book ai didi

python - 扭曲+qtreactor : How to cleanup after last window closed?

转载 作者:行者123 更新时间:2023-12-01 06:11:54 25 4
gpt4 key购买 nike

我有一个 Twisted/PyQt 应用程序,它(除其他外)连接到一堆远程资源。当用户关闭窗口时,我想关闭所有连接,如果可能的话干净地关闭,否则强制关闭。

问题是,当我去关闭连接时, react 堆似乎不再允许我这样做。

这是我的应用程序代码:

# Create app and connect the Twisted/Qt reactors
app = QApplication(sys.argv)
qtreactor.qt4reactor.install()

# Shutdown Twisted when window is closed
@defer.inlineCallbacks
def stop():
print "="*40, "Closing connections..."
yield closeConnections()
print "="*40, "closed."

print "="*40, "Stopping reactor..."
reactor.stop()
print "="*40, "stopped."
app.connect(app, SIGNAL("lastWindowClosed()"), stop)

reactor.runReturn()
rc = app.exec_()
exit(rc)

这是我的清理代码的精简版本:

@defer.inlineCallbacks
def closeConnections():
for connection in connections:
print "Closing connection #%s" % connection
yield threads.deferToThread(popen("/foo/bar/cleanup %s" % connection))
print "Connection closed."

到达第一个打印语句,并且执行命令,但我从未得到第二个打印语句,也没有多次执行 for 循环。

我的分析正确吗?问题是 react 堆已经关闭了,所以我再也没有收到threads.deferToThread 的回复吗?或者还有其他问题吗?另外,我该如何解决它?

谢谢,乔纳森

最佳答案

我不知道 lastWindowClosed() 信号何时触发。然而,即使它足够早地触发,在 react 堆关闭之前(阻止你做你想做的事情),我确信 PyQt 不知道如何处理 stop 函数返回的 Deferred 。这意味着当您的异步清理代码尝试运行时,关闭过程将顺利进行。 GUI 关闭可能会在网络关闭之前完成。

因此,请使用 reactor.addSystemEventTrigger('before', 'shutdown', stop) 代替。我不知道这是否会比 lastWindowClosed() 稍早或稍晚运行,但它会运行得足够早,以便 react 堆仍然可用,并且<将会注意您的函数返回的 Deferred。事实上,关闭将被暂停,直到 Deferred 触发。这为您提供了进行清理所需的所有时间。

除此之外,你不应该这样做 threads.deferToThread(popen("/foo/bar/cleanup %s" % connection)) :

  • 您需要将可调用对象传递给 deferToThread ,而不是调用可调用对象的结果。正如所写,您的代码在 react 器线程中运行 popen 并将文件对象传递给要调用的线程(当然,这没有意义)
  • 混合线程和子进程是不确定的。我不知道,大多数时候你可能会侥幸逃脱。
  • reactor.spawnProcess 可以让您无阻塞、无线程地运行子进程,并且不用担心混合线程和进程。如果您不需要 twisted.internet.utils.getProcessOutput 的所有功能(您似乎不需要),另请参阅 spawnProcess

关于python - 扭曲+qtreactor : How to cleanup after last window closed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5461816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com