我有一个使用 wxWidgets 创建的 GUI 应用程序。作为功能的一部分,我必须在操作 GUI 窗口的同时运行“任务”。例如,我可能会运行代码:
long currentTime = wxGetLocalTime();
long stopTime = wxGetLocalTime() + 3;
while (wxGetLocalTime() != stopTime) {}
wxMessageBox("DONE IN APP");
在那 3 秒的持续时间内,我的应用程序基本上会被卡住,直到显示 wxMessageBox。有没有办法在不使用多线程的情况下让它在后台运行?它给我开发的应用程序带来了问题。
我想知道是否可以使用某些类型的事件处理。非常感谢任何形式的帮助。
最佳答案
有 3 种方法可以在 GUI wx 应用程序中运行耗时任务:
到目前为止,最优选的是使用不同的线程。应用程序“非常 GUI 密集”的解释对我来说真的没有任何意义,我认为如果它的 GUI 强度(无论它是什么)阻止你使用后台工作线程,你应该认真地重新考虑你的程序设计。如果您确实使用这种方法,它非常简单,但要特别注意线程/程序终止问题。特别是,您将需要等待线程完成(如果运行时间不长则可以接受)或在退出程序之前显式取消它。
只要没有其他事件要处理,就使用
EVT_IDLE
事件执行您的任务。这对于可以分解成足够小的 block 的小任务来说还算不错,因为您需要能够在处理程序中恢复处理。不要忘记调用event.RequestMore()
以继续获取空闲事件,即使没有其他事情发生也是如此。最糟糕和最危险的是按照另一个答案的建议调用
wxYield()
。这最初看起来很简单,但您以后会后悔这样做,因为这会在您的代码中造成极难调试的重入问题。如果你确实使用它,你需要自己在任何地方防止重入,你应该真正理解这个函数到底做了什么。
关于c++ - wxWidgets - 单线程多任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13924126/