QFuture帮助,C++ Qt多线程

3

我发现我的UI程序出现了一些问题,因为我没有使用线程。

我查看了文档,从中了解到QFuture似乎是我需要的。我想知道,当你有一个函数并且想要在一个线程中运行它时,是不是就可以使用它?

那么,假设我理解得正确,我按照文档中所有示例中展示的代码进行操作,但实际上它根本不起作用......

UI.cpp

#include <QFuture>
#include <QtConcurrent/QtConcurrentRun>
#include "something.h"
void UI::button_click()
{
     something s;
     QFuture<int> result = QtConcurrent::run(s.heavyFunction());

     result.waitForFinished();
}

something.cpp

int something::heavyFunction()
{
     // heavy code here
     return 42;
}

好的,显然这不是真正的代码,但与我的实际代码没有什么不同,但我收到了以下错误:

error C2780: 'QFuture<T> QtConcurrent::run(T (__cdecl *)(Param1),const Arg1 &)' : expects 2 arguments - 1 provided

它大约说了7次这个错误,基本上是说需要1,2,3,4,5,6,7个参数,但只提供了1个参数?

我从很多示例中获取了这段代码,所以我错过了什么,有什么想法吗?

1个回答

7

QtConcurrent::run函数接受一个要执行的函数和该函数所需的参数。如果要执行的是成员函数,需要像这样传递参数:

something s;
QFuture<int> result = QtConcurrent::run(&s, &something::heavyFunction);

成员函数(例如something::heavyFunction)接受一个类型为T*的隐式参数,其中T是拥有该成员函数的类型(在本例中为something)。QtConcurrent::run似乎通过将实例作为第一个参数,将成员函数作为第二个参数来处理此问题。这似乎不自然、反直觉,并与std::async等函数不一致。


好的,我已经尝试过了,但现在我得到了一个错误:“term does not evaluate to a function taking one argument”... - AngryDuck
我的something s;被声明为成员变量,虽然我认为这没有任何区别? - AngryDuck
@AngryDuck,这不应该有任何区别。您只需要实例的地址,以便在其中运行成员函数。但是,您传递的成员函数必须是“something”的成员。 - juanchopanza
嗯,我也这么想,我已经包含了 <QtConcurrent/QtConcurrentRun><QFuture> 并且加入了你的完整代码,但是我还是得到了上述错误? - AngryDuck
@AngryDuck 哦,好的,你可以试试QtConcurrent::run(&s, &something::heavyFunction)吗? - juanchopanza
@AngryDuck 你确定 something::heavyFunction 返回的是 int 而不是 void 吗? - juanchopanza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接