【发布时间】:2018-09-02 06:44:18
【问题描述】:
我正在用 wxWidgets 编写一个 GUI。我有一个按钮来打开串口并接收数据。里面有一个while(1)循环不断接收数据。
现在我想做一个“断开连接”按钮来停止接收。
当我按下另一个按钮时,是否有事件处理程序或回调函数来中断 while 并从第一个按钮跳出循环?
【问题讨论】:
标签: c++ user-interface button wxwidgets
我正在用 wxWidgets 编写一个 GUI。我有一个按钮来打开串口并接收数据。里面有一个while(1)循环不断接收数据。
现在我想做一个“断开连接”按钮来停止接收。
当我按下另一个按钮时,是否有事件处理程序或回调函数来中断 while 并从第一个按钮跳出循环?
【问题讨论】:
标签: c++ user-interface button wxwidgets
wxButton 在被点击时会发送一条消息。为此消息创建一个处理程序,您可以在其中执行“中断”。
现在,循环只能从其内部退出。我的意思是,在循环中你应该检查一个标志,并根据这个标志的值继续或退出。
我的建议是创建一个工作线程。单击“连接”按钮时,您将创建接收数据的线程。
此线程检查外部标志并根据标志的值完成。
“断开连接”按钮单击处理程序只是将该外部标志设置为一个值,当它检查该标志时,线程会退出。
看看 wxWidgets 源提供的线程示例。
【讨论】:
std::thread。
如果您在“按下按钮”的回调函数中有while(1) 循环,您将挂起 UI。回调函数必须快速返回。
最快的解决方案是将while(1) 循环放入工作线程。这样你的 GUI 就不会挂起。
下一个问题是如何停止循环。这很容易。把循环改成:
while (keep_going.load()) {
....
其中keep_going 的类型为std::atomic_bool。然后你的“停止”按钮就会调用keep_going.store(false)。
【讨论】:
#include <atomic>,你需要拼写atomic而不是actomic(但我猜后者实际上是一个错字:-))。见en.cppreference.com/w/cpp/atomic/atomic
keep_going 初始化为 true 不是吗?否则它将使用默认初始化 bool ... false。