我有一个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。 对于那些试图帮助我的人来说。
答案 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();
}
}