QT 5.7 QThread在QWidget应用程序中运行

时间:2017-01-21 12:21:04

标签: qt qthread qt5.7 myo

我有一个QWiget子类应用程序,它强调了它自己的逻辑,gui,构建,... wigdet应用程序,它应该是myo腕带和鹦鹉无人机的连接器。与无人机的连接工作正常,问题在于腕带。 我有一个实现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/

也尝试了这个 Running function in Qthread - The application will hang  最后我只得到一个分段折叠

当然还有QT Doco。 不幸的是,没有什么真正起作用,我只是混淆了如何在QT 5.7中以正确的方式使用QThread

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

但我怎么能这样做?以及我如何在主窗口中启动线程。

我希望你能给我一些琐事

编辑:经过几个小时的尝试和错误,现在使用此解决方案 Running function in Qthread - The application will hang

只需更改一些内容,例如删除QTimer。 对于那些试图帮助我的人来说。

1 个答案:

答案 0 :(得分: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();
    }
}