所以我发现我的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提供了吗?
我从一些例子中得到了这个代码,所以我错过了什么想法?
答案 0 :(得分:6)
QtConcurrent::run
将函数和参数传递给该函数。对于成员函数,您需要类似
something s;
QFuture<int> result = QtConcurrent::run(&s, &something::heavyFunction);
something::heavyFunction
等成员函数采用类型为T*
的隐式参数,其中T
是具有成员函数的类型(在本例中为something
)。 QtConcurrent::run
似乎通过将实例作为第一个参数并将成员函数作为第二个参数来处理此问题。这似乎不自然,反直觉,与例如不一致std::async
。