因此,该程序使用操纵杆工作,数据从操纵杆输出到接口并通过 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.cpp
slot中执行:joySlot()
void JoyHID::joySlot()
{
joyHIDUpdate(&joyInfo);
emit joySignal(&joyInfo);
}
处理了一次迭代,我得到了一次值的更新。但我需要流不断地旋转,从喜悦中更新价值观。joySlot()
例如,第一个想法是放入slot while(true)
,但这个想法失败了。该应用程序紧紧地挂着。实际上,问题是,我的解决方案有哪些可行的替代方案,在这种情况下应用什么更好?