gpt4 book ai didi

python - 关闭线程循环

转载 作者:太空宇宙 更新时间:2023-11-03 19:23:31 24 4
gpt4 key购买 nike

我正在编写的代码需要在 GUI 应用程序中使用串行端口事件(通过接触开关连接引脚 5 和 8)来触发功能(播放音乐)。我创建了一个循环来监视串行端口,并使其在 pygtk GUI 的单独线程中运行。

我从命令行对此进行测试。当GUI关闭时,监控线程不会立即关闭。它保持打开状态,直到再次触发事件(按下接触开关),然后它将关闭。

我不希望用户需要按下开关才能正确关闭程序!

代码的简化版本是:

#!/usr/bin/python2

import sys
import subprocess
import pygtk
pygtk.require('2.0')
import gtk
import threading
import gobject
from serial import Serial
from fcntl import ioctl
from termios import (
TIOCMIWAIT,
TIOCM_RNG,
TIOCM_DSR,
TIOCM_CD,
TIOCM_CTS
)

ser = Serial('/dev/ttyS0')
wait_signals = (TIOCM_RNG |
TIOCM_DSR |
TIOCM_CD |
TIOCM_CTS)

def startplaying():
#for testing
print('Start playing the track!')

gobject.threads_init()

class SerialWatch(threading.Thread):

def __init__(self):
super(SerialWatch, self).__init__()
self._stop = threading.Event()

def run(self):
if __name__ == '__main__':
while not self._stop.isSet():
ioctl(ser.fd, TIOCMIWAIT, wait_signals)
startplaying()

def stop(self):
self._stop.set()

def stopped(self):
return self._stop.isSet()

class MusicManager():

def delete_event(self, widget, event, data=None):
return False

def destroy(self, widget, data=None):
gtk.main_quit()

def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.connect("delete_event", self.delete_event)
self.window.connect("destroy", self.destroy)
self.window.show_all()

def main(self):
gtk.main()

sw = SerialWatch()
sw.start()

print __name__
if __name__ == "__main__":
music_manager = MusicManager()
music_manager.main()

sw.stop()

我不是一位经验丰富的程序员,希望得到任何帮助。

最佳答案

对于任何可能找到这篇文章并对我如何让事情按照我想要的方式工作感兴趣的人:

我不想按照 smichak 的建议使用轮询。然而,我尝试使用线程运行 TIOCMIWAIT 循环失败了,因为它干扰了 GUI 循环。

我所做的是编写一个单独的 python 脚本来使用 TIOCMIWAIT 循环监视串行端口,并将该脚本作为主 GUI 程序的子进程运行。这样,脚本会在 GUI 打开时启动,并在 GUI 关闭时终止。当在串行端口上建立连接时,脚本使用 dbus 与 GUI 通信并运行所需的功能。

关于python - 关闭线程循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8968031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com