2014-03-19 58 views
0

我以我的第一个步骤,GTK +(C++gtkmm更多specificaly)和我有一个比较概念的疑惑如何以最佳方式结构我的程序。现在我只想让我的GUI通过打印多个值来显示我的C++程序中发生了什么,而且由于在GUI窗口运行期间我的主线程被暂停,因此我遇到了将处理/计算操作和图形界面在不同的线程中。这是否被普遍认为是最好的方式呢,而不是一点也不相关?GTK +接口应该在单独的线程中运行吗?

+0

如果你从不做任何事情,需要几秒钟的时间,通常是亚秒,那么不要使用单独的线程。 OTOH,如果你有很长时间的运行操作,在不同的线程中产生这些操作并将进度消息发布到主线程。但将GUI线程看作主线程 - 其他线程是WORKER线程。 GUI在控制之中。 – Ben

回答

0

是的,绝对!(回复您的标题)

GUI 必须在单独的线程中运行。如果您遇到那些在操作正在进行时会锁定的非常烦人的界面,您会知道为什么让GUI始终运行而不管操作如何都非常重要。

这是一个用户体验的事情。


我的意思并不是说操作过程中禁用某些按键的那些(这是正常的),但那些似乎一切都冻结。

+0

这与线程无关。线程只是这个问题的一个解决方案,而不是解决方案。 – liberforce

3

除非你有一个很好的理由,你通常不会关闭创建新线程更好。同步很难做到正确。

GUI编程是事件驱动(点击一个按钮,有事)。所以你可能需要将你的后台处理绑定到GUI事件系统中。

在你的后台处理需要较长时间的情况下,你需要把它分解成若干块快的。在每个块的末尾,您可以更新进度条并安排下一个块。

这意味着你将需要使用一些状态机模式。

还要确保任何IO都是非阻塞的。

+1

...所有这些都很难适用于任何非平凡的界面,因此无处不在的傻瓜界面。 – Shahbaz

+0

您可以在适当的时候使用“DoEvents”,即'gtk_main_iteration()'来避免状态机模式。取消按钮应该设置一个取消标志,然后在DoEvents之后进行检查。不要忘记禁用GUI(进度对话框/取消按钮除外),以便用户无法开始重叠任务。 – Ben

+0

@Ben我怎么会只运行一次主循环?我正在使用'Gtk :: Application-> run(Gtk :: Window)'并且在文档中找不到任何东西。显然'iteration()'是'Gtk :: Main'的成员。 – joaocandre

相关问题