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