MovetoThread自定义Qobject的问题

时间:2014-02-17 10:43:41

标签: c++ multithreading qt qthread

我是QThreads的新手。并且不明白为什么我的班级没有新的线程ID。但首先要解释一下我的问题。

我有一个普通的c ++类,需要很长时间来计算才能命名她的HeavyBaseClass。在这个课程中,我没有QT元素。

我的目标是在自己的线程中计算这个类,以便GUI在计算时可以正常运行。

我读了一些Qt线程问题的实现,我决定将QTthread与QObject一起使用。因为它应该可以停止线程并且我第一次尝试QtConcurrent这是不可能的。

因为我创建了自己的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文件:

#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() ;
}

现在我在主窗口上调用它

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();

我不明白的问题是我的thead id在alle输出上是相同的。

调查信息:

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

你知道我做错了吗?


更新:

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 ;
     }
}

输出:

 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 

2 个答案:

答案 0 :(得分:2)

根据文档currentThreadId是QThread的STATIC成员,因此您始终打印调用者线程ID。所以你应该打印(quint64)qoptimization.thread()对象成员。

如果您希望您的成员void debugThread();在另一个线程中执行 - 您应该将其声明为SLOT并且不要直接调用。您应该通过连接信号,对象元数据或定时器来调用它。尝试下一个代码:

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有很好的样本。但首先,您应该了解Qt signal/slot系统。

-------用于评论的伪代码:

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!

答案 1 :(得分:1)

当你将一个对象移动到一个线程时,它并不意味着调用这个对象的方法会神奇地在线程中执行。

qoptimization.debugThread();

仍然在调用者线程中执行,这就是它应该如何。要在optimizationThread中执行,您需要使用信号和插槽来触发函数执行。