wxWidgets - 使用单线程进行多任务处理

int*_*ntl 1 c++ multithreading wxwidgets background multitasking

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

long currentTime = wxGetLocalTime();
long stopTime = wxGetLocalTime() + 3;
while (wxGetLocalTime() != stopTime) {}
wxMessageBox("DONE IN APP");
Run Code Online (Sandbox Code Playgroud)

在这3秒的持续时间内,我的应用程序基本上会被冻结,直到显示wxMessageBox.有没有办法让这个在后台运行而不使用多个线程?它为我正在开发的应用程序带来了问题.

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

VZ.*_*VZ. 5

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

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

  2. EVT_IDLE只要没有其他要处理的事件,就使用事件来执行任务.这对于小型任务来说并不算太糟糕,因为您需要能够在处理程序中恢复处理.event.RequestMore()即使没有发生任何事情,也不要忘记打电话继续获得闲置事件.

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

  • 在wxWidgets GUI应用程序开发的上下文中,从各方面来看,线程是迄今为止最好的解决方案.我不打算在这篇评论中解释为什么,但我可以说我有超过15年的经验来证明这一点. (2认同)
  • “线程是邪恶的”是我听过的最不专业的方法。我承认线程不是没有问题的,就像 C++ 中的动态内存分配一样。线程是许多技术的支柱,例如“无线程”node.js。^_^ 如果您使用清晰分离的 GUI / 工作线程设置,您可以编写一个非常干净和合乎逻辑的应用程序。无论如何,您不需要屠宰您的算法以使其进入 EVT_IDLE 的多次调用或处理 wxYield。“非常 GUI 密集型”对我来说只是“耦合”,也许可以改进? (2认同)