【问题标题】:QFuture Help, Threading C++ QtQFuture 帮助,线程化 C++ Qt
【发布时间】:2013-04-15 13:58:29
【问题描述】:

所以我发现我的 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 提供?

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

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

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

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

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

    【讨论】:

    • ok iv 试过了,但现在我得到错误项不评估为采用一个参数的函数...
    • 我的something s; 被声明为成员变量,尽管我认为这没有区别?
    • @AngryDuck 应该没什么区别。你只需要你想要运行成员函数的实例的地址。但你传递的成员函数必须是something的成员。
    • 嗯,我是这么认为的,我已经包含了&lt;QtConcurrent/QtConcurrentRun&gt;' and ` 并包含了您的确切代码,我得到了上面提到的错误?
    • @AngryDuck 好的,你能试试QtConcurrent::run(&amp;s, &amp;something::heavyFunction)吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    相关资源
    最近更新 更多