[英]QVector with Qthreads
您好,我正在尝试构建QThread
对象的QVector
,但是当我尝试构建时,出现此错误'QObject::QObject' : cannot access private member declared in class 'QObject'
。 有人可以告诉我为什么我会收到此错误以及如何解决该错误,还是可以向我指出答案的方向。 谢谢您的时间。
主CPP
#include <QCoreApplication>
#include "thread.h"
#include <QDebug>
#include <QThread>
main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
unsigned long long startingNumberAnswer = 0;
unsigned long long totalIterationsAnswer = 0;
int numberOfThreads = 10;
QVector<Thread> threads(numberOfThreads);
for(int l = 0; l < threads.size(); l++ ){
threads[l].setPriority(QThread::TimeCriticalPriority);
}
for(int i = 1; i< 2000000; i+=numberOfThreads){
qDebug() << "Longest iteration Number = " << startingNumberAnswer;
qDebug() << "Number of iterations for " << startingNumberAnswer << " is " << totalIterationsAnswer;
qDebug() << "Running # " << i;
system("CLS");
}
qDebug() << "Longest iteration Number = " << startingNumberAnswer;
qDebug() << "Number of iterations for " << startingNumberAnswer << " is " << totalIterationsAnswer;
return a.exec();
}
螺纹
#ifndef THREAD_H
#define THREAD_H
#include <QObject>
#include <QThread>
class Thread : public QThread
{
Q_OBJECT
public:
explicit Thread();
unsigned long long getloops();
unsigned long long getnumber();
signals:
public slots:
void run(unsigned long long value);
private:
unsigned long long largestNumber;
unsigned long long loops;
unsigned long long number;
};
#endif // THREAD_H
每次点击费用
#include "thread.h"
Thread::Thread()
{
}
void Thread::run(unsigned long long value)
{
unsigned long long n = value;
unsigned long long counter = 0;
while ( n > 1){
if(n%2 == 0){
n = n/2;
} else {
n = (3*n) + 1;
}
counter++;
}
loops = counter;
number = value;
}
unsigned long long Thread::getloops(){
return loops;
}
unsigned long long Thread::getnumber(){
return number;
}
简单地说,QObject对象不可复制或不可分配-请查看官方文档 :
没有复制构造函数或赋值运算符
QObject既没有复制构造函数,也没有赋值运算符。 这是设计使然。 实际上,它们是通过宏Q_DISABLE_COPY()的私有部分声明的。 实际上,所有从QObject派生的Qt类(直接或间接)都使用此宏将其复制构造函数和赋值运算符声明为私有。 可以在“ Qt对象模型”页面上有关“身份与价值”的讨论中找到其理由。
主要结果是您应该使用指向QObject(或指向QObject子类)的指针,否则可能会引诱您将QObject子类用作值。 例如,没有复制构造函数,就不能使用QObject的子类作为要存储在容器类之一中的值。 您必须存储指针。
因此,您将需要使用QVector<Thread*>
来存储线程(不要忘记在使用对象之前创建对象)。
QVector的值类型必须是可分配的数据类型。 这涵盖了大多数常用的数据类型,但是编译器不允许您例如将QWidget存储为值。 而是存储一个QWidget *。 一些功能有其他要求; 例如,indexOf()和lastIndexOf()期望值类型支持operator ==()。 这些要求是按功能记录的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.