我是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
答案 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
中执行,您需要使用信号和插槽来触发函数执行。