3

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

我看了看,从我在文档中看到的 QFuture 似乎是我需要的,我是否认为当你有一个函数并且你只想在线程中运行它时使用它?

是的,所以假设我是正确的,我浏览了所有示例中显示的文档和类型代码,基本上它根本不起作用......

用户界面.cpp

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

     result.waitForFinished();
}

东西.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 提供?

我从许多示例中获得了此代码,所以我缺少什么想法?

4

1 回答 1

6

QtConcurrent::run接受一个函数和要传递给该函数的参数。在成员函数的情况下,您需要类似

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

成员函数,例如,something::heavyFunction采用 type 的隐式参数T*,其中T是具有成员函数的类型(something在这种情况下)。QtConcurrent::run似乎通过将实例作为第一个参数,将成员函数作为第二个参数来处理这个问题。这似乎不自然且违反直觉,并且与 eg 不一致std::async

于 2013-04-22T15:50:22.623 回答