3

所以我遇到了线程问题。我已经包含了一个类似于我在程序中遇到的示例。当我运行以下代码时,它只会在按下菜单中的“退出”按钮后打印“hello”。它似乎挂在 subprocess.call() 上。我不明白出了什么问题!

另外,我对 Python 中的线程没有经验,而且我对整个语言都是新手,所以请随意对我大喊大叫,因为结构缺陷以及 Python 编程约定!:)

谢谢!

import threading
import subprocess

import gtk

class TestDaemon:
    def __init__(self):

        # start thread here
        cmdman = CommandManager()
        threading.Thread(target=cmdman.run, args=('CmdThread', 1)).start()

        self.icon = gtk.StatusIcon()
        self.icon.set_from_stock(gtk.STOCK_ABOUT)
        self.icon.set_visible(True)

        self.menu = gtk.Menu()
        self.menu_item = gtk.ImageMenuItem(gtk.STOCK_QUIT)
        self.menu_item.connect('activate', self.quit_app, self.menu)
        self.menu.append(self.menu_item)

        self.icon.connect('popup-menu', self.popup_menu, self.menu)
        self.icon.set_visible(True)

        gtk.main()

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

    def popup_menu(self, widget, button, time, data = None):
        if button == 3 and data:
            data.show_all()
            data.popup(None, None, gtk.status_icon_position_menu,
                       3, time, self.icon)

class CommandManager:
    def __init__(self):
        pass

    def run(self, *args):
        subprocess.call('echo "hello"', shell=True)

if __name__ == '__main__':
    TestDaemon()

编辑:我忘了提,如果我在 subprocess.call() 之前添加一个 sys.stdout.write(),sys.stdout.write() 将运行,但 subprocess.call() 不会。

4

2 回答 2

3

(最初作为评论发布):

退出前加入线程:

class TestDaemon:
    def __init__(self):

        # start thread here
        cmdman = CommandManager()
        self.cmdThread = threading.Thread(target=cmdman.run, args=('CmdThread', 1))
        self.cmdThread.daemon = True
        self.cmdThread.start()

        ...

    def quit_app(self, widget, data = None):
        self.cmdThread.join()
        gtk.main_quit()

将线程设置为守护进程是针对主线程引发一些异常并且未调用 join() 的情况。

于 2012-06-02T20:44:30.603 回答
0

您应该使用gtk.mainloop()而不是gtk.main()then 它应该可以工作。

这里的问题是gtk.main()阻塞并且不允许其他线程运行,它可能不会释放 GIL。

于 2012-06-02T18:28:24.757 回答