Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在pygtk中运行单独的线程_Python_Multithreading_Textview_Gtk_Pygtk - Fatal编程技术网

Python 如何在pygtk中运行单独的线程

Python 如何在pygtk中运行单独的线程,python,multithreading,textview,gtk,pygtk,Python,Multithreading,Textview,Gtk,Pygtk,我有一个pygtk应用程序,它在打开python脚本后立即运行。除了gtk.main()之外,我还有一个从脚本开头开始的线程,它刷新gtk.TextView()实例: def listen(self): while True: print "refreshing" data = self.socket.recv(buffer_size) if data: self.txtBuffer.insert(self.txtB

我有一个pygtk应用程序,它在打开python脚本后立即运行。除了gtk.main()之外,我还有一个从脚本开头开始的线程,它刷新gtk.TextView()实例:

def listen(self):
    while True:
        print "refreshing"
        data = self.socket.recv(buffer_size)
        if data:
            self.txtBuffer.insert(self.txtBuffer.get_end_iter(), data + "\n")
            print data

thread.start_new_thread(self.listen, ())
self.set_up_gui() # gtk.main()

但是,当我运行程序时,gui会打开,但不会打印“刷新”文本,发送到套接字时也不会打印任何数据。我曾尝试使用glib.add_idle()来执行这个程序,但是它只在gui空闲时运行单独的线程(这种情况很少发生)。谢谢大家!

您正在从不同的线程访问文本缓冲区,而不进行任何同步,这是不受支持的。要解决此问题,请将
self.txtBuffer.insert(…)
替换为
gobject.idle\u add(lambda:self.txtBuffer.insert(…)
。这会告诉GUI线程在下一次主循环迭代时更新文本缓冲区,这保证在没有显式同步的情况下工作

您应该确保GUI线程未被阻止,即它正在运行
gtk.main()
,并且只处理GUI更新,例如上面的
textBuffer.insert
。长时间运行/阻塞任务应该委托给其他线程或进程,就像您的代码已经尝试做的那样。实现此功能后,GUI更新似乎会立即发生


有关PyGTK和线程的更多详细信息,请参阅。

GUI运行良好,但是数据仍然没有刷新。数据也没有收到,因为打印数据编辑没有打印任何内容:在我看来,GUI根本不允许线程运行修复了它,只是必须正确地实现您的解决方案,非常感谢!