向 QApplication 发送信号
Sending signal to QApplication
我正在向 QApplication 子进程发送 signal.CTRL_BREAK_EVENT
并且子进程的处理程序设法捕获信号(并在退出前执行一些魔术)。但是,当发送信号时,直到我与 QApplication window 交互(导致它以某种方式使用 CPU 周期 LOL),它才会被处理,只有这样它才会处理信号。
例如
- 我将 QApplication 作为子进程启动
- 我发送一个
signal.CTRL_BREAK_EVENT
(从启动子进程的服务器)。
- 没有任何反应。
- 我单击 QApplication 中的任意按钮。
- 它处理
signal.CTRL_BREAK_EVENT
并退出。
我当然希望第 5 步发生在第 3 步。
怎么了?当 QApplication 在子进程中处于 运行 时,我将如何 "refresh" 或虚拟地单击按钮?我怀疑 QApplication 的主事件循环不知何故处于空闲模式……直到应用程序与之交互。 (?)
server.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)
app.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()))
出于投票原因在 app.py 中添加 Qtimer()
似乎可以解决问题。当 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()))
我正在向 QApplication 子进程发送 signal.CTRL_BREAK_EVENT
并且子进程的处理程序设法捕获信号(并在退出前执行一些魔术)。但是,当发送信号时,直到我与 QApplication window 交互(导致它以某种方式使用 CPU 周期 LOL),它才会被处理,只有这样它才会处理信号。
例如
- 我将 QApplication 作为子进程启动
- 我发送一个
signal.CTRL_BREAK_EVENT
(从启动子进程的服务器)。 - 没有任何反应。
- 我单击 QApplication 中的任意按钮。
- 它处理
signal.CTRL_BREAK_EVENT
并退出。
我当然希望第 5 步发生在第 3 步。
怎么了?当 QApplication 在子进程中处于 运行 时,我将如何 "refresh" 或虚拟地单击按钮?我怀疑 QApplication 的主事件循环不知何故处于空闲模式……直到应用程序与之交互。 (?)
server.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)
app.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()))
出于投票原因在 app.py 中添加 Qtimer()
似乎可以解决问题。当 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()))