【问题标题】:Several Error with Implementing of Threads in QT [C++]在 QT [C++] 中实现线程的几个错误
【发布时间】:2021-06-10 23:10:15
【问题描述】:

我是在 QT 中实现线程的新手,即使在多次阅读文档并观看视频之后,我也会遇到一些错误,甚至 Google 都无法帮助我。

thread.cpp:14: 错误: C2440: "Initialisierung": "QFuture" kann nicht in "QFuture" konvertiert werden

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

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

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

【问题讨论】:

  • 删除, QString("Test")
  • @dresherjm 抱歉,忘记删除了。有点在这个问题上坐了很久,所以开始感到疲惫
  • 将错误消息——即使它是德语——放在问题中作为文本而不是作为图像。只有一条错误消息涉及您的特定代码(图像中的前五行左右是 qtconcurrent 内部,因为您的 thread.cpp 中存在问题)
  • 另外,minimal example,这里有很多东西——尤其是你的 UI 代码——对于想要回答的人来说,粘贴和编译并不容易。
  • @AdriaandeGroot 感谢提示,这里很新。将编辑我的帖子,以便更容易阅读:)

标签: c++ multithreading qt compiler-errors qt6


【解决方案1】:

Thread::GenerateTable() 是一个成员函数。它需要一个对象来处理。您正在从(静态)Thread::start() 调用它(呃 .. 将其传递给 QtConcurrent::run())并且没有 Thread 对象可言。

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

【讨论】:

  • 你的意思是像Thread *pntr; pntr = new Thread; 然后使用pntr-&gt;GenerateTable() 而不是Thread::GenerateTable
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-23
相关资源
最近更新 更多