zoukankan      html  css  js  c++  java
  • C++的std::future使用

    1、头文件

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QDebug>
    #include <QDomDocument>
    
    using namespace std;
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    private:
        Ui::MainWindow *ui;
    
        bool is_prime(int x)
        {
            for (int i = 2; i < x; ++i)
                if (x % i == 0)
                    return false;
            return true;
        }
    
        void toUi();
        void toDb();
    private slots:
    
        void on_pushButton_clicked();
    
    };
    
    #endif // MAINWINDOW_H

    2、cpp

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    #include <QDialog>
    
    #include <iostream>
    #include <string>
    #include <fstream>
    using namespace std;
    
    #include<stdio.h>
    #include<math.h>
    #include <memory>
    #include <future>
    
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::toUi()
    {
        qDebug()<<"begin do ui";
        qDebug()<<"doing ui";
        qDebug()<<"end do ui";
    }
    
    void MainWindow::toDb()
    {
        qDebug()<<"begin do db";
    
        std::future < bool > fut = std::async(&MainWindow::is_prime, this, 444444443);
    
        // do something while waiting for function to set future:
        //    qDebug() << "checking, please wait";
        //    std::chrono::milliseconds span(100);
        //    while (fut.wait_for(span) == std::future_status::timeout)
        //        qDebug() << '.' << (int)fut.wait_for(span);
    
        qDebug()<<"doing db";
    
        bool x = fut.get();         // retrieve return value
        qDebug() << "
    444444443 " << (x ? "is" : "is not") << " prime.
    ";
    
    
    
        qDebug()<<"end do db";
    }
    
    //入口函数
    void MainWindow::on_pushButton_clicked()
    {
        qDebug()<<"to do ui";
        std::thread uiThread(&MainWindow::toUi, this);
        uiThread.detach();
    
    
        qDebug()<<"to do db";
        std::thread dbThread(&MainWindow::toDb, this);
        dbThread.detach();
    
        qDebug()<<"other work" <<111111;
    }

    3、结果

     环境是Qt

    说明:

    ①、主线程是可能涉及界面操作或者主要流程管理,不能阻塞;

    ②、需要通过std::thread出一个子线程,用于管理业务线程,业务线程通过std::async生成业务线程,在此线程里可以wait等阻塞;

    ③、在业务线程里做耗时操作,如操作数据库等。

    ④、通过fut.get()函数返回异步运行结果,如果没有完成是会阻塞直到完成;

    ⑤、通过fut.wait_for来定周期判断当前任务是否完成,返回值有三个

      enum class future_status
      {
        ready,    //完成任务
        timeout,   //未完成任务
        deferred    //还未执行任务
      };

    可通过这来设置超时不再执行任务,如超过1分钟某任务还没执行成功,则退出不再执行任务,回收所有内存【如数据库操作时数据库异常】




    长风破浪会有时,直挂云帆济沧海!
    可通过下方链接找到博主
    https://www.cnblogs.com/judes/p/10875138.html
  • 相关阅读:
    hdu 2647 Reward
    hdu 2094 产生冠军
    hdu 3342 Legal or Not
    hdu 1285 确定比赛名次
    hdu 3006 The Number of set
    hdu 1429 胜利大逃亡(续)
    UVA 146 ID Codes
    UVA 131 The Psychic Poker Player
    洛谷 P2491消防 解题报告
    洛谷 P2587 [ZJOI2008]泡泡堂 解题报告
  • 原文地址:https://www.cnblogs.com/judes/p/15031437.html
Copyright © 2011-2022 走看看