与 main 一起终止 GObject.Mainloop() 线程

Posted

技术标签:

【中文标题】与 main 一起终止 GObject.Mainloop() 线程【英文标题】:Terminate GObject.Mainloop() threads together with main 【发布时间】:2016-08-09 09:43:30 【问题描述】:

我有以下两个线程:

myThread = threading.Thread(target=sender.mainloop.run, daemon=True)
myThread.start()

myThread2 = threading.Thread(target=receiver.mainloop.run, daemon=True)
myThread2.start()

目标是 GObject.Mainloop() 方法。 之后我的主程序陷入了无限循环。

我的问题是当执行被CTRL-C终止时,两个线程都会引发Keyboardexception,但主程序并没有终止。

你知道主程序和两个线程如何被 CTRL-C 终止吗?

【问题讨论】:

【参考方案1】:

ctrl-c 发出一个 SIGINT 信号,您可以在主线程中捕获该信号以进行回调。然后,您可以在回调中运行您想要的任何关闭代码,可能是sender/receiver.mainloop.quit() 或其他东西。

import threading                                                                                                      
import signal
import sys 

def loop():
  while True:
    pass

def exit(signal, frame):
  sys.exit(0)

myThread = threading.Thread(target=loop)
myThread.daemon = True
myThread.start()

myThread2 = threading.Thread(target=loop)
myThread2.daemon = True
myThread2.start()

signal.signal(signal.SIGINT, exit)

loop()  

【讨论】:

以上是关于与 main 一起终止 GObject.Mainloop() 线程的主要内容,如果未能解决你的问题,请参考以下文章

将 std::string_view 与 api 一起使用,期望以 null 终止的字符串

exit()子程序终止函数与return()函数的差别

Golang:定时器的终止与重置

UNIX环境高级编程第七章

应用程序始终在 main.m 中终止 [重复]

以编程方式在 main.storyboard 中与项目的其余部分一起制作视图