QTConcurrent 无法编译

QTConcurrent doesn't compile

本文关键字:编译 QTConcurrent      更新时间:2023-10-16

我有一个递归目录复制函数,我想在后台运行。该函数接受两个QString参数:filepath和dir。

从.pro:

QT += core gui sql network concurrent
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
LIBS += -lQt5Concurrent
从代码:

#include <QtConcurrent/QtConcurrent>
#include <qtconcurrentrun.h>
#include <QThread>
...
QFuture <void> future = QtConcurrent::run(copyFolder(filepath,dir));
我得到以下编译错误:
 error: no matching function for call to 'run'
 QFuture <void> future = QtConcurrent::run(copyFolder(filepath,dir) );
                  ^~~~~~~~~~~~~~~~~

如果我像这样调用函数:

QFuture <void> future = QtConcurrent::run(copyFolder, filepath,dir );
error: reference to non-static member function must be called
QFuture <void> future = QtConcurrent::run(copyFolder, filepath,dir );
                            ^~~~~~~~~~

我做错了什么?

我得到以下编译错误:
error: no matching function for call to 'run'
QFuture <void> future = QtConcurrent::run(copyFolder(filepath,dir) );
                  ^~~~~~~~~~~~~~~~~

你不应该像现在这样传递参数。相反,你应该把函数的参数作为参数传递给QtConcurrent::run,参见这里的docs。

你的调用应该看起来像这样:

QFuture <void> future = QtConcurrent::run(copyFolder, filepath, dir);

这样,QtConcurrent将复制您传递的参数,并从默认的QThreadPool在线程中执行函数调用。

如果我像这样调用函数:

QFuture <void> future = QtConcurrent::run(copyFolder, filepath,dir );
  error: reference to non-static member function must be called
QFuture <void> future = QtConcurrent::run(copyFolder, filepath,dir );
                               ^~~~~~~~~~

如果你必须调用类中的非静态成员函数,你必须传递你想在其上运行函数的对象,参见这里的文档。假设您正在使用来自类中的另一个成员函数的QtConcurrent::run(因为如果不是这样,您将得到不同的错误),您应该执行以下操作:

QFuture <void> future = QtConcurrent::run(this, &ClassName::copyFolder, filepath, dir);

请注意,您必须确保对共享数据的所有访问(在两个线程之间)都应该序列化(可能使用QMutex)。