0

我正在向signal.CTRL_BREAK_EVENTQApplication 子进程发送一个,并且子进程的处理程序设法捕获信号(并在退出之前执行一些魔术)。但是,当发送信号时,直到我与 QApplication 窗口交互(导致它以某种方式使用 CPU 周期 LOL)才对其进行处理,然后它才会处理信号。

例如

  1. 我将 QApplication 作为子进程启动
  2. 我发送一个signal.CTRL_BREAK_EVENT(从启动子进程的服务器)。
  3. 什么都没发生。
  4. 我单击 QApplication 中的任何按钮。
  5. 它处理signal.CTRL_BREAK_EVENT和退出。

我当然希望第 5 步在第 3 步进行。

怎么了?当它在子进程中运行时,我将如何“刷新” QApplication 或虚拟单击按钮?我怀疑 QApplication 的主事件循环不知何故处于空闲模式......直到应用程序与之交互。(?)

服务器.py

app = None

def start_app():
    global app

    app = subprocess.Popen("python app.py")

def exit_app():
    global app

    p = app.poll()
    if p==None:
        print("Subprocess is alive") # debug
    app.send_signal(signal.CTRL_BREAK_EVENT)

应用程序.py

import sys, signal
from runner import mainWindow

from PyQt5.QtWidgets import QApplication

app = None
mw = None

def exit_signal_handler(signal, frame):
    global app, mw

    print("Terminate signal received")
    app.quit()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    signal.signal(signal.SIGBREAK, exit_signal_handler)

    mw = mainWindow.MainWindow() # this is the Qt window starting
    mw.actionExit.triggered.connect(app.quit)

    sys.exit("Runner exit with code: " + str(app.exec()))
4

1 回答 1

0

Qtimer()出于投票原因在 app.py 中添加一个似乎可以解决问题。pollMe()当被调用时,发送的任何信号都将每秒处理一次Qtimer

import sys, signal
from runner import mainWindow
from PyQt5 import QtCore           #<---- NEW
from PyQt5.QtWidgets import QApplication

app = None
mw = None

def pollMe():                      # <--- NEW
    timerPoll.start(1000)

def exit_signal_handler(signal, frame):
    global app, mw

    print("Terminate signal received")
    app.quit()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    signal.signal(signal.SIGBREAK, exit_signal_handler)

    timerPoll = QtCore.QTimer()        #<---- NEW
    timerPoll.timeout.connect(pollMe)
    timerPoll.start(1000)

    mw = mainWindow.MainWindow() # this is the Qt window starting
    mw.actionExit.triggered.connect(app.quit)

    sys.exit("Runner exit with code: " + str(app.exec()))
于 2018-02-10T20:44:48.653 回答