C++ wxWidgets上的按钮

C++ wxWidgets上的按钮,c++,user-interface,button,wxwidgets,C++,User Interface,Button,Wxwidgets,我正在用wxWidgets编写GUI。我有一个按钮来打开一个串口并接收数据。在中有一个while(1)循环不断地接收数据 现在我想做一个“断开”按钮来停止接收 当我按下另一个按钮时,是否有一个事件处理程序或回调函数来中断while并从第一个按钮跳出循环 wxButton在单击时发送消息。为此消息创建一个处理程序,在其中执行“中断” 现在,一个循环只能从它的内脏中退出。我的意思是,在循环中,您应该检查一个标志,并根据该标志的值继续或退出 我的建议是创建一个工作线程。单击“连接”按钮后,您将创建接收

我正在用wxWidgets编写GUI。我有一个按钮来打开一个串口并接收数据。在中有一个
while(1)
循环不断地接收数据

现在我想做一个“断开”按钮来停止接收


当我按下另一个按钮时,是否有一个事件处理程序或回调函数来中断while并从第一个按钮跳出循环

wxButton在单击时发送消息。为此消息创建一个处理程序,在其中执行“中断”

现在,一个循环只能从它的内脏中退出。我的意思是,在循环中,您应该检查一个标志,并根据该标志的值继续或退出

我的建议是创建一个工作线程。单击“连接”按钮后,您将创建接收数据的线程。
此线程检查外部标志并根据标志的值完成。 “disconnect”按钮单击处理程序只是将该extern标志设置为一个值,该值使线程在检查该标志时退出

查看wxWidgets源代码提供的线程示例。

如果在“按钮按下”的回调函数中有
而(1)
循环,则将挂起UI。回调函数必须快速返回

最快的解决方案是将
while(1)
循环放入工作线程。这样您的GUI就不会挂起

下一个问题是如何停止循环。那很容易。将循环更改为:

while (keep_going.load()) {
    ....

其中
keep_go
属于
std::atomic_bool
类型。然后,您的“停止”按钮只会调用
继续。存储(错误)

非常感谢您的快速回复!工作线程是什么样子的?我现在尝试了几件事,但不幸的是,我还没有把它做好。@MSol这是另一个问题的重点,这里没有更多的评论。您可以从wxWidgets发行版中的线程示例开始,或者改用
std::thread
。非常感谢您的快速回复!它说actomic_bool不是stdyYou's need
#include我仍然有一个问题,我使用了原子_bool keep_go变量,但当我使用:while(keep_go.load()){…}时,它从不跳进我的程序,而你却将
keep_go
初始化为
true
,不是吗?否则,它将对
bool
使用默认初始化。。。这是
false