Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在QT[C+;+;]中实现线程时出现几个错误_C++_Multithreading_Qt_Compiler Errors_Qt6 - Fatal编程技术网

C++ 在QT[C+;+;]中实现线程时出现几个错误

C++ 在QT[C+;+;]中实现线程时出现几个错误,c++,multithreading,qt,compiler-errors,qt6,C++,Multithreading,Qt,Compiler Errors,Qt6,我对在QT中实现线程还不熟悉,即使在阅读了几次文档并观看了视频之后,我还是发现了一些错误,甚至连谷歌都帮不上我的忙 thread.cpp:14:错误:C2440:“初始化”:“QFuture”中的“QFuture”kann nicht 错误代码是德语,试图更改QT语言,但没有更改错误的语言。如果需要,我可以翻译 错误似乎发生在这个QFuture future=QtConcurrent::run(&Thread::GenerateTable)命令,甚至认为我是按照QT文档中的1:1编写的。 这是我

我对在QT中实现线程还不熟悉,即使在阅读了几次文档并观看了视频之后,我还是发现了一些错误,甚至连谷歌都帮不上我的忙

thread.cpp:14:错误:C2440:“初始化”:“QFuture”中的“QFuture”kann nicht

错误代码是德语,试图更改QT语言,但没有更改错误的语言。如果需要,我可以翻译

错误似乎发生在这个
QFuture future=QtConcurrent::run(&Thread::GenerateTable)命令,甚至认为我是按照QT文档中的1:1编写的。
这是我想放在一个线程中的代码,你可以看到它正在将一些数字写入一个文件,这大约需要一分钟

线程.h

\ifndef线程
#定义线程
#包括
#包括
#包括
类线程:公共QObject
{
Q_对象
公众:
显式线程(QObject*parent=nullptr);
静态bool start();
私人:
int GenerateTable();
};
#endif//THREAD\u H
线程.cpp

#包括“thread.h”
线程::线程(QObject*父级):QObject(父级)
{
}
bool线程::start()
{
QFuture future=QtConcurrent::run(&Thread::GenerateTable);
if(future.result()==0){
返回true;
}
其他的
返回false;
}
int Thread::GenerateTable(){
QString Path=QDir::currentPath();
QFile文件(路径+“/Table.csv”);
如果(!file.open(QFile::WriteOnly | QFile::Text)){
返回-1;
}
否则{
QTextStream流(&文件);
constexpr uint64_t upper=10'000'000;
QVector rando(上);
std::iota(rando.begin(),rando.end(),1);
std::shuffle(rando.begin(),rando.end(),
std::mt19937(std::random_设备{}());
对于(uint32_t i=0;i<10'000'000;++i){

stream
Thread::GenerateTable()
是一个成员函数。它需要一个对象来处理。您从(静态)
Thread::start()
调用它(呃..将它传递给
QtConcurrent::run()
),而没有线程对象可谈


虽然您已经标记了Qt6,但我将指出调用成员函数的方法:您可以传递需要从某处分配的对象(指针)。

删除
,QString(“测试”)
@dresherjm抱歉,忘了删除它。这个问题已经讨论了很长时间了,所以开始感到筋疲力尽。将问题中的错误消息(即使是德语)作为文本而不是图像。只有一条错误消息涉及您的特定代码(由于thread.cpp中的问题,图像中的前五行左右都是新的。此外,这里有很多内容,特别是您的UI代码,对于想要回答的人来说,粘贴和编译起来并不容易。@Adriaandegrot感谢Tipp,这里很新。将编辑我的帖子,以便更容易阅读:)你的意思是像
Thread*pntr;
pntr=new Thread;
然后使用
pntr->GenerateTable()
而不是
Thread::GenerateTable
#ifndef THREAD_H
#define THREAD_H

#include <QObject>
#include <QFuture>
#include <QtConcurrent/QtConcurrent>


class Thread : public QObject
{
    Q_OBJECT
public:
    explicit Thread(QObject *parent = nullptr);

    static bool start();

private:
   int GenerateTable();
};

#endif // THREAD_H

#include "thread.h"

Thread::Thread(QObject *parent) : QObject(parent)
{

}

bool Thread::start()
{

    QFuture<int> future = QtConcurrent::run(&Thread::GenerateTable);
    if (future.result() == 0){
        return true;
    }
    else
        return false;
}

int Thread::GenerateTable(){

    QString Path = QDir::currentPath();
    QFile file(Path + "/Table.csv");
    if (!file.open(QFile::WriteOnly | QFile::Text)){
        return -1;
    }
    else{
        QTextStream stream(&file);
        constexpr uint64_t upper = 10'000'000;
        QVector<uint64_t> rando(upper);

        std::iota(rando.begin(), rando.end(), 1);
        std::shuffle(rando.begin(), rando.end(),
                     std::mt19937(std::random_device{}()));

        for (uint32_t i = 0; i < 10'000'000; ++i) {
          stream << rando[i] << ',' << '\n';
        }
        return 0;
    }
}