QTConcurrent 不编译

QTConcurrent doesn't compile

我有一个递归目录复制功能,我想在后台 运行。该函数有两个 QString 参数,文件路径和目录。

来自.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 );
                            ^~~~~~~~~~

我做错了什么?

I get the following compile error:

error: no matching function for call to 'run'
QFuture <void> future = QtConcurrent::run(copyFolder(filepath,dir) );
                  ^~~~~~~~~~~~~~~~~

你不应该像现在这样传递参数。相反,您应该将函数的参数作为参数传递给 QtConcurrent::run,请参阅文档 here.

您的电话应如下所示:

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

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

If I call the function like this:

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 );
                               ^~~~~~~~~~

如果您必须在 class 中调用非静态成员函数,则必须将您想要的对象传递给 运行 函数,请参阅文档 here .假设您在 class 中使用来自另一个成员函数的 QtConcurrent::run (因为如果不这样做,您会得到不同的错误),您应该这样做:

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

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