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
)。