Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在QRunnable线程中使用jpype后,如何让我的pythonqt应用程序关闭?_Python_Multithreading_Pyqt5_Pyside2_Jpype - Fatal编程技术网

在QRunnable线程中使用jpype后,如何让我的pythonqt应用程序关闭?

在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

我正在使用PySide2在一个不可命名的线程中使用jpype。当我试图关闭应用程序时,通过关闭主窗口,Python脚本不会完成。我认为仍然有一些资源处于活动状态

QThreadPool报告没有活动线程

我创建了一个简单的演示应用程序。我的实际应用程序要求线程中的代码在其生命周期内多次运行,因此我不能做任何激进的事情,比如在线程运行后关闭JVM

我想知道一个干净的方法,当我想关门的时候

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