这里主要是个事例,并不涉及业务逻辑处理。在此记录下。

程序运行截图如下:

这里有下面这个类BigDataTest对数据进行的类。

MySQLInstance采用单例双重锁模式对数据库进行操作。

源码如下:

BigDataTest.h

#ifndef CONCURRENT_H
#define CONCURRENT_H#include <QObject>
#include <QList>class BigDataTest : public QObject
{Q_OBJECT
public:BigDataTest(QObject *parent = 0);void run();protected:bool connectMySQL();friend QString sqlResult(const QString &cmd);private:QList<QString> m_str;
};#endif // CONCURRENT_H

MySQLInstance.h

#ifndef MYSQLINSTANCE_H
#define MYSQLINSTANCE_H#include <QSqlDatabase>class MySQLInstance
{
public:static MySQLInstance *getInstance();QString execSql(const QString &cmd);protected:MySQLInstance();void connectMySQL();private:static MySQLInstance *m_instance;QSqlDatabase m_db;
};#endif // MYSQLINSTANCE_H

BigDataTest.cpp

#include "BigDataTest.h"
#include "MySQLInstance.h"
#include <QDebug>
#include <QtConcurrent>
#include <QSqlQuery>BigDataTest::BigDataTest(QObject *parent) : QObject(parent)
{m_str << "SELECT 1 + 1" << "SELECT 100 * 100 * 100 / 10" << "SELECT 100 + 99" << "SELECT 1 + 1"<< "SELECT 1 + 1 + 500" << "SELECT 1 + 1 + 1000" << "SELECT 1999 - 199" << "SELECT 1999 + 10"<< "SELECT 1 + 1 + 8888" << "SELECT 1 + 1 + 788";
}QString sqlResult(const QString &cmd)
{qDebug() << "处理SQL语句进程 : " << QThread::currentThread();MySQLInstance *instance = MySQLInstance::getInstance();return instance->execSql(cmd);
}void BigDataTest::run()
{QList<QString> retList = QtConcurrent::blockingMapped(m_str, sqlResult);qDebug() << "返回结果";qDebug() << retList;
}

main.cpp

#include <QCoreApplication>
#include "BigDataTest.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);BigDataTest bigDataTest;bigDataTest.run();return a.exec();
}

MySQLInstance.cpp

#include "MySQLInstance.h"
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
#include <QMutex>
#include <QVariant>MySQLInstance *MySQLInstance::m_instance = nullptr;
QMutex mt;MySQLInstance *MySQLInstance::getInstance()
{if(m_instance == nullptr){mt.lock();if(m_instance == nullptr){m_instance = new MySQLInstance();mt.unlock();return m_instance;}mt.unlock();}return m_instance;
}QString MySQLInstance::execSql(const QString &cmd)
{if(m_instance == nullptr){Q_ASSERT(!"m_instance == nullptr");}//简单点,返回值只有一个mt.lock();QSqlQuery query(m_db);if(!query.exec(cmd)){mt.unlock();qDebug() << "error:" << query.lastError().text();return "error";}mt.unlock();QString ret = "none";while(query.next()){ret = query.value(0).toString();}return ret;
}MySQLInstance::MySQLInstance()
{connectMySQL();
}void MySQLInstance::connectMySQL()
{m_db = QSqlDatabase::addDatabase("QMYSQL");m_db.setHostName("127.0.0.1");m_db.setPort(3306);m_db.setDatabaseName("mysql");m_db.setUserName("root");m_db.setPassword("root");m_db.open();
}

程序打包下载地址:

https://github.com/fengfanchen/Qt/tree/master/DealWithBigData

Qt笔记-多线程检索数据库(单例多重锁,QtConcurrent::blockingMapped)相关推荐

  1. 【Qt学习】利用数据库单例完成 登录匹配 注册 功能实现

    目录 一:效果展示 二:源码分享 三:数据库查找操作 一:效果展示 注册成功,给出提示  登录成功,给出提示  二:源码分享 mysqlite.h .cpp #ifndef MYSQLITE_H #d ...

  2. java基础—多线程下的单例设计模式的安全问题

    //多线程下的单例设计模式 class Sing {//饿汉式不存在安全问题,因为其不是线程同步的private static Sing s = new Sing();private Sing(){} ...

  3. 2020-10-23 集合+序列化+递归+多线程+泛型+枚举+单例+反射小记

    [集合]: Collection接口 (Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类.但是却让其被继承产生了两个接口,就是Set和List) Set接口(无序集合 ...

  4. JAVA_Lesson8(传智播客笔记之继承、单例设计模式懒汉式、饿汉式)

    数组对象工具的建立(重要的是这种思想) 主函数是静态的,主函数需要调用的也需要static. 当有2个.java文件时,先编译含有函数功能的.java文件,再编译含主函数的.java文件.(因为主函数 ...

  5. 【Qt】QtCreator中的单例编程(以ActionManager为例)

    1.ActionManager简介 ActionManager类负责注册菜单和菜单项以及键盘快捷键. ActionManager的公共函数都是静态的,只有使用信号时,才用到单例. 2.ActionMa ...

  6. c# 多线程单例模式_单例模式,多线程单例,双重锁定单例,工场单例创建上下文...

    单例模式,多线程单例,双重锁定单例,工厂单例创建上下文. 单例子模式定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个 ...

  7. 多线程在单例中的应用,生产者消费者模式(线程的通信)

    单例的实现方式:懒汉式和饿汉式 其中,懒汉式是线程不安全的,当有多条线程同时访问单例对象时,则会出现多线程临界资源问题 单例实现步骤: 1 私有化构造方法 2 在类中创建对象 3 通过公开的方法返回这 ...

  8. Java 单例设计模式

    Singleton:单例模式 1.在整个应用程序中,一个类只有一个实例对象 2.这个实例对象只能通过本类中创建=====>私有化构造 3.别人还得使用,通过本类中创建的一个对外访问的接口,来返回 ...

  9. redis 主从配置_应用 | Redis实现 主从,单例,集群,哨兵,配置应用

    小小经过一天的休整 公众号更新规则:每周六将会停更一次,进行短期的休整,其余时间继续每天一更. 思维导图如下 Redis 主从配置 这里配置Redis主从 什么是主从 主从复制,是指把一台Redis服 ...

最新文章

  1. OpenCV中的特征匹配+单应性以查找对象
  2. UE中的几个极有用功能
  3. FEMS:微生物群落生态学数据挖掘的R包microeco
  4. JavaOne 2016后续活动
  5. Solr中的前缀和后缀匹配
  6. 9.6 LSMW程序删除操作手册-录屏
  7. 小程序 | 保存图片时处理名称的细节(时间戳+后缀名)
  8. 列举5个python内置函数和使用方法_Python基础-----函数、内置函数、递归等练习
  9. Codeblocks下载、安装的详细过程
  10. 《红孩儿引擎内功心法修练与Cocos2d-x》之结点系统(场景,层,精灵)(精)
  11. java视频文件格式转换,视频文件格式转换器-视频文件格式转换器 2018 官方版
  12. 常用面试问题50问(转载)及回答技巧
  13. Delphi CxGrid 用法详解
  14. monocle安装不成功 想尽各种办法
  15. 第二百九十三,Memcached缓存
  16. 贝塞尔曲线介绍及其应用
  17. iOS开发-审核被拒原因总结[持续更新]
  18. Servlet 原来是这个玩意儿,看完恍然大悟 ~
  19. 弘辽科技:新手卖家如何制作高点击率主图
  20. 世界上最远的距离 ——泰戈尔

热门文章

  1. C# 将内存中的datatable数据导出为Excel(方法二,创建Excel对象导出)
  2. 如何开发ORACLE存储过程
  3. CCNA考试试验总结
  4. 专心写即时通讯软件争取CSDN认证专家
  5. 15个设计得最糟糕最变态的CAPTCHA验证码
  6. 程序员:代码全部替换成中文,你能接受吗?
  7. 学习C/C++:伴随我成长的编程书!
  8. 5分钟 0元搭建个人独立博客网站(二)
  9. Vue 3.0暂缓发布,前端同学暂时舒了一口气
  10. 第二节:简易安装 和 快速入门Vue.js