async并发识别二维码

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

c++ async 实现并发


前言

在测试运算中有所需要,在此记录下C++实现基础的并发;

#include <zbar.h>
#include <iostream>
#include <future>
#include <chrono>
#include <QObject>
#include <vector>
#include <iomanip>
#include <mutex>

using namespace std;
std::mutex m_lock;
std::chrono::high_resolution_clock::time_point a1;
std::chrono::high_resolution_clock::time_point a2;
int inital = 0;
typedef void(*callback)();

void statical_count()
{
    m_lock.lock();
    a2 = std::chrono::high_resolution_clock::now();
    inital++;
    if(inital == 1000)
    {
        float total_cost = std::chrono::duration<float, std::milli>(a2 - a1).count();
        cout << setprecision(3) << total_cost << "ms" << endl;
    }
    m_lock.unlock();
}


int deal_bar_code(QString name, callback vv)
{
    zbar::ImageScanner scanner;
    scanner.set_config(zbar::zbar_symbol_type_e::ZBAR_QRCODE, zbar::ZBAR_CFG_ENABLE, 1);
    QImage image(name);
    image = image.convertToFormat(QImage::Format_Grayscale8, Qt::AutoColor);
    int width = image.width();
    int height = image.height();
    uchar *raw = (uchar *)image.bits();
    zbar::Image imageZbar(width, height, "Y800", raw, width * height);
    scanner.scan(imageZbar); //扫描条码
    zbar::Image::SymbolIterator symbol = imageZbar.symbol_begin();
    if (imageZbar.symbol_begin() == imageZbar.symbol_end())
    {
        qDebug() << name << endl;
        return 0;
    }
    QString m_data = QString::fromStdString(symbol->get_data());
    return m_data.toInt();
}
int main(int argc, char *argv[])
{
    vector<QString> val_list;
    QDir dir("C://Users//aqiang//Desktop//test_zbar//templist");
    QStringList datafilter;
    datafilter << "*.png";
    QFileInfoList infolist = dir.entryInfoList(datafilter, QDir::Files);
    for(int i = 0; i < 100;i ++)
    {
        for(int j = 0; j < infolist.size(); j++)
        {
            val_list.push_back(infolist.at(j).absoluteFilePath());
        }
    }

    vector<future<int>> res;
    a1 = std::chrono::high_resolution_clock::now();
    for_each(val_list.begin(), val_list.end(), [&](QString &nane){res.push_back(std::async(std::launch::async, deal_bar_code, nane, statical_count));});
    system("pause");
    return 0;
}

总结

充分发挥CPU的算力, 使用async,实现并发识别二维码,大幅提高了运算效率;
提示:async函数中,务必将第一个参数置为 std::launch::async, 使用默认参数, 将会退化为同步运算,而达不到异步效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值