0

我有一个 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 空闲时运行单独的线程(这是不常见的)。谢谢!

4

1 回答 1

2

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

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

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

于 2013-06-15T11:25:28.610 回答