-1

我有一个 QWiget 子类应用程序,它实现了自己的逻辑、gui、build、.. wigdet 应用程序,它应该是 myo 腕带和 Parrot Drone 的连接器。与无人机的连接工作正常,问题出在腕带上。我有一个实现wirstband监听器的类

#include <MyoLibrary/include/myo/myo.hpp>    

class MyoDeviceListener: public myo::DeviceListener
{
public:

   MyoDeviceListener();
   virtual void onArmSync(myo::Myo *myo, uint64_t timestamp, myo::Arm arm, myo::XDirection xDirection, float rotation, myo::WarmupState warmupState) override;
   virtual void onArmUnsync(myo::Myo *myo, uint64_t timestamp) override;
   virtual void onBatteryLevelReceived(myo::Myo *myo, uint64_t timestamp, uint8_t level) override;
   virtual void onPair(myo::Myo *myo, uint64_t timestamp, myo::FirmwareVersion firmwareVersion) override;
   virtual void onUnpair(myo::Myo *myo, uint64_t timestamp)override;
   virtual void onLock(myo::Myo *myo, uint64_t timestamp) override;
   virtual void onUnlock(myo::Myo *myo, uint64_t timestamp) override;
   virtual void onPose(myo::Myo *myo, uint64_t timestamp, myo::Pose pose)override;
strong text

};

和cpp。

#include "myodevicelistener.h"

#include <qDebug>    


MyoDeviceListener::MyoDeviceListener()
{

}

void MyoDeviceListener:: onArmSync(myo::Myo *myo, uint64_t timestamp, myo::Arm arm, myo::XDirection xDirection, float rotation, myo::WarmupState warmupState)
{    
    qDebug()<<"synced";
}

void MyoDeviceListener::onArmUnsync(myo::Myo *myo, uint64_t timestamp)
{
    qDebug()<<"unsynced";
}

void MyoDeviceListener::onBatteryLevelReceived(myo::Myo *myo, uint64_t timestamp, uint8_t level)
{
     qDebug()<<"battery"<<level;
}

void MyoDeviceListener::onPair(myo::Myo *myo, uint64_t timestamp, myo::FirmwareVersion firmwareVersion)
{
    qDebug()<<"Paired";
}

void MyoDeviceListener::onUnpair(myo::Myo *myo, uint64_t timestamp)
{
    qDebug()<<"unpaired";
}
void MyoDeviceListener::onLock(myo::Myo *myo, uint64_t timestamp)
{
    qDebug()<<"locked";
}

void MyoDeviceListener:: onUnlock(myo::Myo *myo, uint64_t timestamp)
{
    qDebug()<<"unlocked";
}

void MyoDeviceListener::onPose(myo::Myo *myo, uint64_t timestamp, myo::Pose pose)
{    
    switch(pose.type())
    {
    case 1: qDebug()<<"Fist";
        myo->notifyUserAction();
        break;
    case 2: qDebug()<<"Wave in";
        myo->notifyUserAction();
        break;
    case 3: qDebug()<<"Wave out";
        myo->notifyUserAction();
        break;
    case 4: qDebug()<<"Spread Fingers";
        myo->notifyUserAction();
        break;
    }
    myo->unlock(myo->unlockHold);

    if (pose.type()==5)
    {
        qDebug()<<"double tapped";
        qDebug()<<"Lock.";
     myo->lock();
    }
}

为了开始这个,我在 mainwindow.cpp 中创建了一个方法

void MainWindow::startMyo()
{

    try
    {
        //Application Identifier muss ein reverse String sein
        myo::Hub hub("com.adcsp.myo");

        qDebug()<<"Verbundenes Myo wird gesucht...";
        myo::Myo* myo =hub.waitForMyo(10000);


        if(!myo)
            {
                qDebug()<<"Myo nicht gefunden.";
            }
         else
            {
                qDebug()<<"Myo wurde gefunden.";
                MyoDeviceListener myoDL;

                hub.addListener(&myoDL);

                while (1)
                {
                    hub.run(1000/20);
                }
            }
    }
    catch(std::exception& e )
    {
        qDebug()<<"error: "<<e.what();
    }

}

问题显然是,一旦我调用此方法,Gui 就会冻结 while 循环的原因。myo 连接本身工作正常,我得到了我想要的所有手势。

我知道我需要一个 Qthread,但我不明白这在我的情况下是如何工作的。我喜欢很多这样的博客:

https://conf.qtcon.org/system/attachments/104/original/multithreading-with-qt.pdf?1473018682

https://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/

还在 Qthread 中尝试了这个 正在运行的功能 - 应用程序最终会挂起 我只得到一个分段折叠

当然还有 QT Doco。不幸的是,没有什么能真正起作用,我只是对如何在 QT 5.7 中以正确的方式使用 QThread 感到困惑

我知道我需要以某种方式对我的方法进行子类化,或者只是为了连接信号和插槽(虽然不确定是哪一个)

但我到底该怎么做呢?以及我必须如何在我的主窗口中启动线程。?

我希望你能给我一些tips

编辑:经过几个小时的尝试和错误,它现在可以使用此解决方案 在 Qthread 中运行功能 - 应用程序将挂起

只需要改变一些东西,比如移除 QTimer。Ty 对于那些试图帮助我的人。

4

1 回答 1

0

你的代码很糟糕。如果没有更多信息,就不可能使您的代码成为多线程的(为什么?Stackoverflow 不是代码编写服务)。此代码将使用 100% 的 CPU 内核时间,但它会工作。

void MainWindow::startMyo()
{
    qDebug() << "This aplication is designed to crash.";
    try
    {
        myo::Hub hub("com.adcsp.myo");

        myo::Myo* myo = nullptr;

        while(!myo)
        {
            myo = hub.waitForMyo(1);
            qDebug() << "Application is terrible, shutdown it, please";
            if(rand() % 15 == 0) QCoreApplication::processEvents();
        }
        if(myo)
        {
            MyoDeviceListener myoDL;

            hub.addListener(&myoDL);

            while (1)
            {
                hub.run(1000/20);
                QCoreApplication::processEvents();
            }
        }
    }
    catch(const std::exception& e)
    {
        qDebug()<< "Error, it is not crashing, suffer more, ahahaha: " << e.what();
    }
}
于 2017-01-21T16:03:39.423 回答