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

How do I get my Python Qt app to close after using jpype in a QRunnable thread?

我在 QRunnable 线程中使用 jpype(使用 PySide2)。当我尝试通过关闭主 window 关闭应用程序时,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_()
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()

output

INFO:root:starting thread
INFO:root:JVM started
INFO:root:JVM stopped