Несколько ошибок при реализации потоков в QT [C++]

Я новичок в реализации потоков в QT, и даже после того, как несколько раз прочитал документацию и просмотрел видео, я получаю некоторую ошибку, с которой даже Google не может мне помочь.

thread.cpp:14: ошибка: C2440: «Initialisierung»: «QFuture» не может быть преобразовано в «QFuture» преобразовано

Коды ошибок на немецком языке, попытка изменить язык QT, но язык ошибок не изменился. Если нужно, могу их перевести.

Кажется, что ошибка происходит в этом QFuture<int> future = QtConcurrent::run(&Thread::GenerateTable);команда, даже подумал, что написал ее 1: 1 как из документации QT. Вот код, который я хочу поместить в поток, поскольку вы можете видеть, что он записывает небольшую группу чисел в файл, что занимает около минуты.

Thread.h

      #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

Thread.cpp

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

2 ответа

Thread::GenerateTable()является функцией-членом . Ему нужен объект, над которым можно работать. Вы называете это (э-э ... передаете его QtConcurrent::run()) из (статического) Thread::start() и нет объекта Thread, о котором можно было бы говорить.

Хотя вы отметили Qt6, я укажу на документацию Qt5 для вызова функций-членов: вы можете передать объект (указатель), который вам нужно будет откуда-то выделить.

Самое простое решение: сделать GenerateTable статический также

      private:
   static int GenerateTable();

Это сработает "из коробки", позвонив

      Thread::start();

Или, наоборот, пусть все функции будут функциями-членами:

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

    bool start();

private:
   int GenerateTable();
};

и использовать this как первый аргумент QtConcurrent::run:

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

Тогда используйте это так:

      Thread thread;
thread.start();

Или оставь start статичен, но пусть Threadэкземпляр для работы. Либо вы создаете его внутри функции:

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

или вы передаете ему в качестве аргумента:

      static bool start(Thread *);


bool Thread::start(Thread * thread)
{
    QFuture<int> future = QtConcurrent::run(thread, &Thread::GenerateTable);
    if (future.result() == 0){
        return true;
    }
    else
        return false;
}
Другие вопросы по тегам