【问题标题】:Python&PyGTK: Transport data to threadingPython PyGTK:将数据传输到线程
【发布时间】:2012-10-29 13:53:44
【问题描述】:

我想将数据传输到线程类,但我不知道出了什么问题。下面的代码来自这个question,我稍微改了一下。

这是一个代码:

import gtk, gobject, threading, time

gobject.threads_init()

class T(threading.Thread):
    pause = threading.Event()
    stop = False

    def start(self, data, *args):
        super(T, self).start()

    def run(self, data):
        while not self.stop:
            self.pause.wait()
            gobject.idle_add(lambda *a : self.rungui(data))
            time.sleep(0.1)

    def rungui(self, data):
        print "printed"
        print data

thread = T()

class Start:

        def toggle_thread(self, data=None, *args):
                if not thread.is_alive():
                    thread.start(data)
                    thread.pause.set()
                    self.button.set_label('Pause Thread')
                    return

                if thread.pause.is_set():
                    thread.pause.clear()
                    self.button.set_label('Resume Thread')
                else:
                    thread.pause.set()
                    self.button.set_label('Pause Thread')

        def __init__(self):
                thread = T()
                window = gtk.Window()
                self.button = gtk.ToggleButton('Start Thread')
                data = 3
                self.button.connect('toggled', lambda *a : self.start(data), None)
                window.add(self.button)
                self.button.show()
                window.show()

        def start(self, data=None):
                self.toggle_thread(data)

        def main(self):
                gtk.main()

if __name__ == "__main__":
        start = Start()
        start.main()

我必须纠正什么才能让线程完全工作?

【问题讨论】:

    标签: python multithreading pygtk


    【解决方案1】:

    不要在 gui 线程之外使用 gtk。关于:

    gobject.idle_add(self.rungui)
    

    链接中的示例可以正常工作,但需要 system kill 命令才能终止。 而且 super() 不能给 run() 函数带来参数。

    我的线程初始化如下所示:

    class VirtService(threading.Thread):
            def __init__(self, queue):
                    threading.Thread.__init__(self)
                    self.queue = queue
    
            def thread_loop(self):
                    while self.queue.qsize():
                            data_command = self.queue_get()
    
    ...
    
    queue = Queue()
    
    if __name__ == '__main__':
            gobject.threads_init()
            vs = VirtService(queue)
    

    您可以使用队列进行双向数据转换。您也可以使用队列命令。在非图形线程中通过 Queue.qet() 创建 c++ poll() 模拟,并在 gui 线程中 queue.put()

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多