关闭一个线程循环

时间:2012-01-23 06:40:20

标签: python serial-port pygtk

我正在处理的代码需要使用串行端口事件(将引脚5和8连接到接触开关)来触发GUI应用程序中的功能(播放音乐)。我创建了一个监视串口的循环,并在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()

我不是一位经验丰富的程序员,非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

对于任何可能找到这篇文章的人,并且对我如何以我想要的方式工作感兴趣:

我不想像smichak建议那样使用民意调查。但是,我尝试使用线程来运行TIOCMIWAIT循环失败,因为它干扰了GUI循环。

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