在QRunnable线程中使用jpype后,如何让我的pythonqt应用程序关闭?
我正在使用PySide2在一个不可命名的线程中使用jpype。当我试图关闭应用程序时,通过关闭主窗口,Python脚本不会完成。我认为仍然有一些资源处于活动状态 QThreadPool报告没有活动线程 我创建了一个简单的演示应用程序。我的实际应用程序要求线程中的代码在其生命周期内多次运行,因此我不能做任何激进的事情,比如在线程运行后关闭JVM 我想知道一个干净的方法,当我想关门的时候在QRunnable线程中使用jpype后,如何让我的pythonqt应用程序关闭?,python,multithreading,pyqt5,pyside2,jpype,Python,Multithreading,Pyqt5,Pyside2,Jpype,我正在使用PySide2在一个不可命名的线程中使用jpype。当我试图关闭应用程序时,通过关闭主窗口,Python脚本不会完成。我认为仍然有一些资源处于活动状态 QThreadPool报告没有活动线程 我创建了一个简单的演示应用程序。我的实际应用程序要求线程中的代码在其生命周期内多次运行,因此我不能做任何激进的事情,比如在线程运行后关闭JVM 我想知道一个干净的方法,当我想关门的时候 import logging import sys import PySide2.QtCore as qtc i
import logging
import sys
import PySide2.QtCore as qtc
import PySide2.QtWidgets as qtw
import jpype
class Worker(qtc.QRunnable):
def run(self):
jpype.startJVM()
logging.info("JVM started")
def main():
logging.basicConfig(level=logging.INFO)
app = qtw.QApplication(sys.argv)
window = qtw.QWidget()
window.show()
thread_pool = qtc.QThreadPool()
worker = Worker()
logging.info("starting thread")
thread_pool.start(worker)
app.exec_()
输出
为此,在main中添加一个信号并在Worker类中订阅它以挂起Worker线程将起作用。然而,我的问题是我需要让JVM在多个线程调用上运行。所以,我不能每次都关闭它。我将属性设置器添加到退出函数中,因为您在该流中的问题中描述了这个问题。您可以将其与exit分离,以不调用线程。您可能有一个线程字典来存储具有适当标识符的多个线程。由于每个worker都有自己的state和identity属性,因此可以通过在dictionary中搜索identity并将state属性设置为false来调用它。如果你考虑用AssiCIO图书馆实现它,应该有一些改进,我最后做的是保持一个线程运行的应用程序的生命周期。然后,我只启动JVM一次,并在整个应用程序生命周期中使用它。当需要停止时,关闭JVM会导致应用程序挂起——但我从JVM中检测到线程,这允许应用程序关闭。
import sys
import time
import logging
import jpype
import PySide2.QtCore as qtc
import PySide2.QtWidgets as qtw
class Worker(qtc.QRunnable):
_status = None
def __init__(self):
super(Worker, self).__init__()
self.status = -1
@property
def status(self):
return self._status
@status.setter
def status(self, value):
self._status = value
def run(self):
logging.info("JVM started")
jpype.startJVM()
while True:
if self.status != -1:
# jpype.stopJVM()
logging.info("JVM stopped")
break
time.sleep(1)
def main():
logging.basicConfig(level=logging.INFO)
app = qtw.QApplication(sys.argv)
window = qtw.QWidget()
window.show()
thread_pool = qtc.QThreadPool()
worker = Worker()
worker.status = -1
logging.info("starting thread")
thread_pool.start(worker)
status = app.exec_()
worker.status = status
sys.exit(status)
if __name__ == "__main__":
main()
INFO:root:starting thread
INFO:root:JVM started
INFO:root:JVM stopped