如何在wxWidgets GUI中运行另一个事件时运行事件?

时间:2017-10-24 06:03:47

标签: c++ wxwidgets

我创建了一个有两个按钮的GUI。一个是开始按钮,另一个是停止按钮。当按下开始时,程序将在后台执行,gui将冻结。我再也无法控制窗户了。即使鼠标点击也没有响应。停止按钮用于停止程序。由于窗口没有响应,因为它正在运行程序我不能按停止。什么是可能的解决方案? 。请帮助

1 个答案:

答案 0 :(得分:0)

线程是程序中的子程序。当应用程序启动时,它将在主线程中运行。你可以创建许多其他线程;所有这些(包括主要的)共享应用程序内存空间(例如,范围内的相同全局变量)。

有两种线程:"分离"和"可加入"。 分离的线程在完成后会自行删除,将它们视为"触发并忘记"。相反, joinable 线程只有在完成工作后才会被自己删除。

在wxWidgets中,所有GUI都在主线程中执行。从另一个线程调用GUI功能是一场噩梦,不要这样做。

您的情况属于典型情况。 "开始"按钮启动一个线程来完成一些工作。如果你想取消这份工作,你可以按下"停止"按钮。

如何指示线程取消其工作?
虽然您可以使用wxCondition,但您也可以自行设置标记。工作线程会在某个时刻读取此标志(它不是 automagic ,您必须对其进行编码)并根据其值停止或继续。在访问标志之前不要忘记使用wxMutex来保护它免受同时更改它的另一个线程的影响。

此外,线程可以将消息发布到主线程事件循环。通过这种方式,您可以告诉主线程您的工作线程已完成其工作。

线程在您编码时需要更多关注。您必须避免某些情况,例如:

  • "死锁":两个线程互相等待,没有一个完成。
  • "竞争条件":多个线程尝试同时更改共享值 时间。

有关wxWidgets docs和线程示例的详情。

最后,C ++ 11有std::thread和其他相关的朋友(互斥,信号量等)。您可以选择使用它而不是wxWidgets类。