【问题标题】:buttons on wxWidgetswxWidgets 上的按钮
【发布时间】:2018-09-02 06:44:18
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ user-interface button wxwidgets


    【解决方案1】:

    wxButton 在被点击时会发送一条消息。为此消息创建一个处理程序,您可以在其中执行“中断”。

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

    我的建议是创建一个工作线程。单击“连接”按钮时,您将创建接收数据的线程。
    此线程检查外部标志并根据标志的值完成。

    “断开连接”按钮单击处理程序只是将该外部标志设置为一个值,当它检查该标志时,线程会退出。

    看看 wxWidgets 源提供的线程示例

    【讨论】:

    • 非常感谢您的快速回复!
    • 那个工作线程是什么样子的?我现在尝试了几件事,但不幸的是我还没有成功。
    • @MSol 这是另一个问题的关键,这里没有更多的 cmets。您可以从 wxWidgets 发行版中的 thread 示例开始,或者改用std::thread
    【解决方案2】:

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

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

    下一个问题是如何停止循环。这很容易。把循环改成:

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

    其中keep_going 的类型为std::atomic_bool。然后你的“停止”按钮就会调用keep_going.store(false)

    【讨论】:

    • 非常感谢您的快速回复!
    • 它说actomic_bool不是std的成员
    • 你需要#include <atomic>,你需要拼写atomic而不是actomic(但我猜后者实际上是一个错字:-))。见en.cppreference.com/w/cpp/atomic/atomic
    • 我仍然有这个问题,我使用 atomic_bool keep_going 变量但是当我使用:while(keep_going.load()){...} 它永远不会跳到我的 while
    • 您确实将 keep_going 初始化为 true 不是吗?否则它将使用默认初始化 bool ... false
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2021-03-28
    相关资源
    最近更新 更多