考虑混乱和启蒙。它们都提供闲置者并将事件回调添加到事件循环中。两者似乎都不提倡使用线程,而是建议使用事件驱动编程。
但是,如果您有一个数据生产者在返回之前会花费几秒钟的处理时间怎么办?
在闲置或事件循环中添加这种处理肯定会阻止 UI 响应吗?
你应该如何用 UI 框架做这些事情?
仅供参考 - 我们在 Python 中使用这两个框架。
谢谢。
考虑混乱和启蒙。它们都提供闲置者并将事件回调添加到事件循环中。两者似乎都不提倡使用线程,而是建议使用事件驱动编程。
但是,如果您有一个数据生产者在返回之前会花费几秒钟的处理时间怎么办?
在闲置或事件循环中添加这种处理肯定会阻止 UI 响应吗?
你应该如何用 UI 框架做这些事情?
仅供参考 - 我们在 Python 中使用这两个框架。
谢谢。
如果您的生产者代码不能分成小块,那么您绝对应该使用线程。考虑到 GL 的线程模型(状态机的上下文存储在线程本地存储中),Clutter 与 GTK+ 一样,甚至比 GTK+ 更重要,除了调用 clutter_init() 和 clutter_main() 的线程之外,不能由不同的线程使用;另一方面,使用 GMainLoop 工具将 UI 更新从线程调度到主循环中是完全可以接受的。
Clutter 在 Git 存储库中有一个关于如何实现此模式的示例:
http://git.gnome.org/browse/clutter/tree/examples/threads.c
简而言之,在线程内执行阻塞操作时,您应该使用 gobject.idle_add() 来安排 UI 更新。
实际上有一个更好的方法可以通过使用gobject.idle_add
和生成器函数在没有线程的情况下实现这一点:
def my_task(data):
# ...some work...
while heavy_work_needed:
...do heavy work here...
progress_label.set_text(data) # here we update parts of UI
# there's more work, return True
yield True
# no more work, return False
yield False
def on_start_my_task_button_click(data):
task = my_task(data)
gobject.idle_add(task.next)
有关详细信息,请参阅此常见问题解答条目