Как закрыть приложение Python Qt после использования jpype в потоке QRunnable? - PullRequest
0 голосов
/ 30 апреля 2020

Я использую jpype в потоке QRunnable (используя PySide2). Когда я пытаюсь закрыть приложение, закрывая главное окно, скрипт Python не завершается sh. Я предполагаю, что все еще есть активные ресурсы.

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_()

1 Ответ

1 голос
/ 01 мая 2020
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
...