RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1420776
Accepted
Andrew Popov
Andrew Popov
Asked:2022-08-16 16:18:12 +0000 UTC2022-08-16 16:18:12 +0000 UTC 2022-08-16 16:18:12 +0000 UTC

QThread中的无限循环

  • 772

因此,该程序使用操纵杆工作,数据从操纵杆输出到接口并通过 Modbus 传输。为此,决定将来自操纵杆的数据接收和处理放到一个单独的线程中。一个单独的类被设计在joyhid.h:

#ifndef JOYHID_H
#define JOYHID_H

#include <QObject>
#include <cstdint>
#include "hidapi.h"

typedef struct _HID_JOYSTK_Info
{
    uint16_t              X;
    uint16_t              Y;
    uint16_t              Z;
    uint16_t              X_low;
    uint16_t              Y_low;
    uint8_t               buttons[5];
}
HID_JOYSTK_Info_TypeDef;

class JoyHID : public QObject
{
    Q_OBJECT

public:
    explicit JoyHID(QObject *parent = nullptr);

public slots:
    void joySlot();

signals:
    void joySignal(HID_JOYSTK_Info_TypeDef *obj);

private:
    void joyHIDUpdate(HID_JOYSTK_Info_TypeDef *obj);
};

#endif // JOYHID_H

它mainwindow.cpp被扔到一个单独的线程中:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QThread *joy_thread = new QThread;
    JoyHID *joystck = new JoyHID;
    joystck->moveToThread(joy_thread);
    connect(joy_thread, SIGNAL(started()), joystck, SLOT(joySlot()));
    connect(joystck, &JoyHID::joySignal, this, &MainWindow::uiSlot);
    joy_thread->start();
}

下面的简单代码在joyhid.cppslot中执行:joySlot()

void JoyHID::joySlot()
{
    joyHIDUpdate(&joyInfo);
    emit joySignal(&joyInfo);
}

处理了一次迭代,我得到了一次值的更新。但我需要流不断地旋转,从喜悦中更新价值观。joySlot()例如,第一个想法是放入slot while(true),但这个想法失败了。该应用程序紧紧地挂着。实际上,问题是,我的解决方案有哪些可行的替代方案,在这种情况下应用什么更好?

c++ qt
  • 2 2 个回答
  • 73 Views

2 个回答

  • Voted
  1. Best Answer
    Sergey Tatarincev
    2022-08-16T17:00:23Z2022-08-16T17:00:23Z

    无限的 while(true) 循环阻塞线程的事件循环并且不再处理事件/信号。最简单的方法是在循环中触发事件处理:

    void JoyHID::joySlot()
    {
        while(true){
            joyHIDUpdate(&joyInfo);
            emit joySignal(&joyInfo);
            qApp->processEvents();
        };
    }
    

    或在插槽末尾重新发出信号(它将排队等待处理并在其他所有操作之后处理)

    joihid.h

    class JoyHID : public QObject
    {
    //.....
    signals:
        void joySignal(HID_JOYSTK_Info_TypeDef *obj);
        void joyWork();
    //.....
    }
    

    joihid.cpp

    JoyHID::JoyHID(QObject *parent)
    {
        //.....
        connect(this, &JoyHID::joyWork, this, &JoyHID::joySlot);
    }
    
    void JoyHID::joySlot()
    {
        joyHIDUpdate(&joyInfo);
        emit joySignal(&joyInfo);
        emit joyWork();
    }
    

    更好的是,将您的类视为有限状态机(请参阅QStateMachine)。这将是最美丽最正确的

    • 2
  2. Bearded Beaver
    2022-08-16T19:26:01Z2022-08-16T19:26:01Z

    作为替代方案,我可以建议使用计时器,以便在给定的时间间隔内发出一次具有操纵杆状态的信号。在你的构造函数中JoyHID是这样的:

    timer = new QTimer(this);
    timer->setInterval(10); // will emit 100 times per second
    connect(timer, &QTimer::timeout, this, &JoyHID::joySlot);
    timer->start();
    

    顺便说一句,使用这种方法,如果仅需要 joySlot 方法来服务于信号的发射,则可以将其替换为 lambda:

    connect(timer, &QTimer::timeout, this, [this]() {
        joyHIDUpdate(&joyInfo);
        emit joySignal(&joyInfo);
    });
    
    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5