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.有没有办法让这个在后台运行而不使用多个线程?它为我正在开发的应用程序带来了问题.
我想知道是否有一些类型的事件处理可以使用.非常感谢任何形式的帮助.
有三种方法可以在GUI wx应用程序中运行耗时的任务:
到目前为止,最优选的是使用不同的线程.应用程序的解释是"非常智能的GUI"对我来说真的没有任何意义,我认为如果它的GUI强度(无论它是什么)阻止你使用后台工作线程,你应该认真重新考虑你的程序设计.如果你使用这种方法,它很简单,但要特别注意线程/程序终止问题.特别是,您需要等待线程完成(如果不需要很长时间才能运行),或者在退出程序之前显式取消它.
EVT_IDLE
只要没有其他要处理的事件,就使用事件来执行任务.这对于小型任务来说并不算太糟糕,因为您需要能够在处理程序中恢复处理.event.RequestMore()
即使没有发生任何事情,也不要忘记打电话继续获得闲置事件.
最糟糕和最危险的是wxYield()
按照另一个答案的建议打电话.这最初看起来很简单,但您会后悔这样做,因为这会在您的代码中创建极难调试的重入问题.如果你确实使用它,你需要防止你自己的重入,你应该真正理解这个功能到底是做什么的.