zoukankan      html  css  js  c++  java
  • QtConcurrent::run() 的使用

    QFuture<T>run(constClass

    *object,T
    (Class::*fn)(Param1,Param2,Param3,Param4,Param5)const,const
    Arg1 
    &arg1,const
    Arg2 
    &arg2,const
    Arg3 
    &arg3,const
    Arg4 
    &arg4,const
    Arg5 
    &arg5)

    run()函数的原型如上,此函数是QtConcurrent命名空间里的函数.主要功能是令启动一个线程来执行一个函数.Concurrent的英文示意就是并发的意思.

    下面简要的介绍run()函数的使用方法:

    1.首先要有一个需要在另外开启的线程中执行的函数:

    void thread_add(QObject*receiver,inta,intb)

    {
        QString message=QString("%1 + %2 = %3").arg(a).arg(b).arg(a+b);
        QApplication::postEvent(receiver,new ProgressEvent(true, message));
    }

    函数在线程中运行完毕后会向receiver发送一个消息,来返回结果.

    2.有了要在线程中运行的函数,再来看看怎么启动线程来运行这个函数

    void MainWindow::on_pushButton_clicked()

    {
    
    

    for(int i=0;i<9;i++)

            for(int j=0;j<9;j++)
        QtConcurrent::run(thread_add,this,i,j);
    }

    点击一个按钮就会运行这段代码,然后启动8*8=64个线程,线程要运行的函数就是thread_add(之前定义的),消息接收对象就是MainWindow这个类的实例

    3.线程得到了运行会发送消息给MainWindow,MainWindow重新实现boolMainWindow::event(
    QEvent*
    event)处理接收到的消息,并显示出来

    bool MainWindow::event(
    QEvent*
    event)

    {
        if (event->type() ==
                static_cast<QEvent::Type>(ProgressEvent::EventId)) {
            ProgressEvent *progressEvent =
                    static_cast<ProgressEvent*>(event);
            Q_ASSERT(progressEvent);
            ui->teLog->append(progressEvent->message);
            return true;
        }
        return QMainWindow::event(event);
    }

    再给出自定义的消息结构

    struct ProgressEvent:
    publicQEvent

    {
        enum {EventId = QEvent::User};
        explicit ProgressEvent(bool saved_, const QString &message_)
            : QEvent(static_cast<Type>(EventId)),
              saved(saved_), message(message_) {}
        const bool saved;
        const QString message;
    };

  • 相关阅读:
    hdu1050 Moving Tables
    初读《数学之美》........................(2)
    初读《数学之美》........................(1)
    zju1058 Currency Exchange
    hdu 2391 Filthy Rich
    hdu1029 Ignatius and the Princess IV(统计)
    hdu1072 Nightmare (BFS)
    apache2.2 + tomcat 6 集群
    权限管理系统实现:
    设置页面那些ID对应的对象隐藏setDisplay
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/6564540.html
Copyright © 2011-2022 走看看