我以我的第一个步骤,GTK +(C++
和gtkmm
更多specificaly)和我有一个比较概念的疑惑如何以最佳方式结构我的程序。现在我只想让我的GUI通过打印多个值来显示我的C++程序中发生了什么,而且由于在GUI窗口运行期间我的主线程被暂停,因此我遇到了将处理/计算操作和图形界面在不同的线程中。这是否被普遍认为是最好的方式呢,而不是一点也不相关?GTK +接口应该在单独的线程中运行吗?
回答
是的,绝对!(回复您的标题)
GUI 必须在单独的线程中运行。如果您遇到那些在操作正在进行时会锁定的非常烦人的界面,您会知道为什么让GUI始终运行而不管操作如何都非常重要。
这是一个用户体验的事情。
我的意思并不是说操作过程中禁用某些按键的那些(这是正常的),但那些似乎一切都冻结。
这与线程无关。线程只是这个问题的一个解决方案,而不是解决方案。 – liberforce
除非你有一个很好的理由,你通常不会关闭创建新线程更好。同步很难做到正确。
GUI编程是事件驱动(点击一个按钮,有事)。所以你可能需要将你的后台处理绑定到GUI事件系统中。
在你的后台处理需要较长时间的情况下,你需要把它分解成若干块快的。在每个块的末尾,您可以更新进度条并安排下一个块。
这意味着你将需要使用一些状态机模式。
还要确保任何IO都是非阻塞的。
...所有这些都很难适用于任何非平凡的界面,因此无处不在的傻瓜界面。 – Shahbaz
您可以在适当的时候使用“DoEvents”,即'gtk_main_iteration()'来避免状态机模式。取消按钮应该设置一个取消标志,然后在DoEvents之后进行检查。不要忘记禁用GUI(进度对话框/取消按钮除外),以便用户无法开始重叠任务。 – Ben
@Ben我怎么会只运行一次主循环?我正在使用'Gtk :: Application-> run(Gtk :: Window)'并且在文档中找不到任何东西。显然'iteration()'是'Gtk :: Main'的成员。 – joaocandre
下面是在利用主回路中无需额外的线程较小的块冗长的操作分裂的一个例子。 Lazy Loading using the main loop。
- 1. MediaPlayer应该在单独的线程中运行吗?
- 2. Swift CoreBluetooth:CentralManager是否应该在单独的线程中运行?
- 3. 接口应该在一个单独的项目中吗?
- 4. 我应该有一个单独的接口程序集吗?
- 5. 在单独的线程中运行VCL
- 6. 运行在单独的线程
- 7. twisted + gtk:我应该在线程中还是在反应器线程中运行GUI?
- 8. 在Java中,每个查询应该在单独的线程中吗?
- 9. 在单独线程上运行ALAssetLibrary块
- 10. 我应该在后台线程中运行一切吗?
- 11. 我应该将公共接口放在单独的文件中吗?
- 12. gtk#窗口线程
- 13. BeginInvoke()是否运行单独的线程?
- 14. MySQL的C类接口:执行从单独的线程查询
- 15. 如何在单线程中使用多个可运行接口?
- 16. 在单独的线程中运行窗体表单
- 17. IComparer接口是否在C#中的单独线程上工作?
- 18. jBPM - 在单独的线程中运行进程
- 19. 在Qt中运行单独的进程或线程
- 20. Qt:我应该在一个线程上运行QFileWatcher吗?
- 21. GTK#.NET应用程序不需要单独的GTK#安装
- 22. Android:在应用程序范围外的单独线程中运行任务
- 23. GTK的主循环可以从辅助线程运行吗?
- 24. 在单独的窗口运行脚本
- 25. Task.Continuewith中的新任务(在单独的线程上运行)
- 26. 如何使Office 2013窗口在单独的进程中运行
- 27. ServerSocket的服务 - 它应该在一个单独的线程?
- 28. 在单独的线程中运行SimpleXMLRPCServer并关闭
- 29. Google Analytics(分析)是否在单独的线程中运行?
- 30. 如何在单独的线程中运行计时器?
如果你从不做任何事情,需要几秒钟的时间,通常是亚秒,那么不要使用单独的线程。 OTOH,如果你有很长时间的运行操作,在不同的线程中产生这些操作并将进度消息发布到主线程。但将GUI线程看作主线程 - 其他线程是WORKER线程。 GUI在控制之中。 – Ben