2012-10-29 39 views
1

我想将数据传输到线程类,但我无法弄清楚什么是错的。下面的代码是从这个question,我改变了一点。Python&PyGTK:将数据传输到线程

这是一个代码:

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() 

我有什么纠正得到充分穿线工作?

回答

0

不能使用gtk退出gui线程。那大约:

gobject.idle_add(self.rungui) 

示例在您的链接工作正常,但需要终止系统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()中创建C++ poll()模拟

相关问题