栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

async并发识别二维码

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

async并发识别二维码

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

c++ async 实现并发
  • 前言
  • 总结


前言

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

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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(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 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> 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, 使用默认参数, 将会退化为同步运算,而达不到异步效果。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/920970.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号