Несколько ошибок при реализации потоков в 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;
}