提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
在测试运算中有所需要,在此记录下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, 使用默认参数, 将会退化为同步运算,而达不到异步效果。