c++ - wxWidgets - 单线程多任务

标签 c++ multithreading background wxwidgets multitasking

我有一个使用 wxWidgets 创建的 GUI 应用程序。作为功​​能的一部分,我必须在操作 GUI 窗口的同时运行“任务”。例如,我可能会运行代码:

long currentTime = wxGetLocalTime();
long stopTime = wxGetLocalTime() + 3;
while (wxGetLocalTime() != stopTime) {}
wxMessageBox("DONE IN APP");

在那 3 秒的持续时间内,我的应用程序基本上会被卡住,直到显示 wxMessageBox。有没有办法在不使用多线程的情况下让它在后台运行?它给我开发的应用程序带来了问题。

我想知道是否可以使用某些类型的事件处理。非常感谢任何形式的帮助。

最佳答案

有 3 种方法可以在 GUI wx 应用程序中运行耗时任务:

  1. 到目前为止,最优选的是使用不同的线程。应用程序“非常 GUI 密集”的解释对我来说真的没有任何意义,我认为如果它的 GUI 强度(无论它是什么)阻止你使用后台工作线程,你应该认真地重新考虑你的程序设计。如果您确实使用这种方法,它非常简单,但要特别注意线程/程序终止问题。特别是,您将需要等待线程完成(如果运行时间不长则可以接受)或在退出程序之前显式取消它。

  2. 只要没有其他事件要处理,就使用 EVT_IDLE 事件执行您的任务。这对于可以分解成足够小的 block 的小任务来说还算不错,因为您需要能够在处理程序中恢复处理。不要忘记调用 event.RequestMore() 以继续获取空闲事件,即使没有其他事情发生也是如此。

  3. 最糟糕和最危险的是按照另一个答案的建议调用 wxYield()。这最初看起来很简单,但您以后后悔这样做,因为这会在您的代码中造成极难调试的重入问题。如果你确实使用它,你需要自己在任何地方防止重入,你应该真正理解这个函数到底做了什么。

关于c++ - wxWidgets - 单线程多任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13924126/

相关文章:

python - Python 中的快速方法调用调度

python - 制作游戏时,我无法导入背景图像或 Sprite

css - 根据分辨率自动调整背景图像大小

c++ - SWIG:未使用 %module 或 -module 指定模块名称

c++ operator= const 引用的方法

java - 在 Java 中,如何创建一个重用 Git 存储库的线程安全应用程序?

java - 让 Selenium firefox 驱动程序正确退出 - Java

c++ - 代码更改不生效

c++ - pair<int,int> vector 上的 lower_bound 有效,upper_bound 无效

iphone - 在iOS上后台录音