Domanda

i am new with QThreads. And didn't understand why i get no new Thread Id for my class. But first a few basic about my problem.

I have a normal c++ class which need a long time to compute lets name her HeavyBaseClass. In this class i have no QT elements.

My goal is to compute this class in her own thread so that the GUI can run normal when she is computing.

I read a few implementation for Qt threading problem and I decided to use QTthread with an QObject. Becuase it should be possible to stop the thread and with my first try QtConcurrent this was not possible.

Because that i created my own QObject: h.file:

#include <QObject>
#include <HeavyBaseClass.h>
class Qoptimization : public QObject , HeavyBaseClass
{
    Q_OBJECT
public:
    Qoptimization(HeavyBaseClass INPUT PARAMETER,QObject *parent = 0);
    void debugThread();
signals:

public slots:

};

#endif // QOPTIMIZATION_H

cpp file:

#include "qoptimization.h"
#include <QDebug>
#include <QThread>
Qoptimization::Qoptimization(HeavyBaseClass INPUT PARAMETER, QObject *parent) :
    QObject(parent),HeavyBaseClass (INPUT PARAMETER)
{
    qDebug() << " init Thread " <<   this->thread()->currentThreadId() ;
}

void Qoptimization::debugThread(){
    qDebug() << " current Thread " <<   thread()->currentThreadId() ;
}

now i call this on my mainwindow

qDebug() << " Main Thread " <<   this->thread()->currentThreadId();
Qoptimization qoptimization(f);
QThread *optimizationThread = new QThread();
qDebug() << " before moving to Thread " <<   qoptimization.thread()->currentThreadId();
qoptimization.moveToThread(optimizationThread);
optimizationThread->start();
qoptimization.debugThread();
qDebug() << " after moving Thread " <<   qoptimization.thread()->currentThreadId();

the problem which i dont understand is that my thead id is the same on alle outputs.

DEBUG Information:

 Main Thread  0xd88 
 init Thread  0xd88 
 before moving to Thread  0xd88 
 current Thread  0xd88 
 after moving Thread  0xd88 

Do you have an idea what I did wrong ?


UPDATE:

new cpp

void Qoptimization::debugThread(){
    qDebug() << " in debugThred currentThread() " <<   QThread::currentThread() ;
    qDebug() << " in debugThread Thread " <<   thread() ;

    if ( QThread::currentThread() != thread() )
     {
         // Force slot to be emmited in object thread
         QTimer::singleShot( 0, this, SLOT( debugThread() ) );
         return ;
     }
}

Output:

 Main Thread  0x156c 
 init Thread  0x156c 
 before moving to Thread  0x156c 
 in debugThred currentThread()  QThread(0xeccc00) 
 in debugThread Thread  QThread(0x24cad80) 
 after moving Thread  0x156c 
È stato utile?

Soluzione

According to documentation currentThreadId is STATIC member of QThread, so you always print callers thread id. So you should print (quint64)qoptimization.thread() member of object.

If you want your member void debugThread(); to be executed in another thread - you should declare it as a SLOT and do not call directrly. You should call it throught connected signals, object metadata or timers. Try next code:

public slots:
    void Qoptimization::debugThread();

void Qoptimization::debugThread()
{
    if ( QThread::currentThread() != thread() )
    {
        // Force slot to be emmited in object thread
        QTimer::singleShot( 0, this, SLOT( debugThread() ) );
        return ;
    }

    qDebug() << " current Thread " <<   thread()->currentThreadId() ;
}

Qt documentation has good samples. But first, you should understand Qt signal/slot system.

------- Pseudocode for comment:

class MyClass
{
  int thread() const { return m_id; }
  void moveToThread( int threadid ) { m_id = threadid; }
  int m_id;
}

MyClass a;
const int curThread = 1;
a.moveToThread( 2 );
qDebug() << curThread << " " << a.thread();
// output: 1 2 // already different!

Altri suggerimenti

When you move an object to a thread it doesnt mean calling this object methods will magically be executed in the thread.

qoptimization.debugThread();

Is still executing in the caller thread, and that's how it should be. To execute in optimizationThread you need to use signals and slots to trigger function executions.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top