qt下编写linux消息队列,C++11消息队列 + Qt线程池 + QRunnable执行任务简单模型
1、模板类queue,包含头文件中,是一个FIFO队列。
queue.push():在队列尾巴增加数据
queue.pop():移除队列头部数据
queue.font():获取队列头部数据的引用
...
2、Qt库的线程池,QThreadPool
QThreadPool.setMaxThreadCount():设置线程池最大线程数
QThreadPool.start(new QRunnable(..)):开启线程池调用QRunnable
3、QRunnable执行任务
void run();//重写虚函数,在里面消费任务队列
setAutoDelete(true)//默认就是true,消费结束自动回收内存
4、代码
run.h
#ifndef RUN_H#define RUN_H#include#include#include#include
structMyString
{
std::stringvalueStr;
};class Run : public QObject , publicQRunnable
{
Q_OBJECTpublic:
Run()= default;
Run(const MyString&myString);protected:~Run() = default;voidrun();
signals:publicslots:private:
MyString myString;
};#endif //RUN_H
说明:MyString结构体代替实际项目中的任务,Run接口的run纯虚函数用来消费分配来的MyString
run.cpp
#include "run.h"#include#includeRun::Run(const MyString &myString)
{this->myString =myString;//this->setAutoDelete(true);//默认就是true
}voidRun::run()
{//std::cout << "value:" << this->myString.valueStr <
qDebug() << "value:" << QString::fromStdString(myString.valueStr) << "thread:" <<:currentthreadid>
QThread::msleep(100);
}
说明:不使用cout打印是因为,cout打印不是原子操作,可能多个字符串被杂糅在一起打印;qDebug不会,应该底层加了锁
main.cpp
#include #include"run.h"#include#include#include#include
using namespacestd;
queuemyList;
mutex myMutex;volatile bool addThreadIsEnd = false;voidmakeListThread();int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
cout<< "begin main" <
thread addThread(makeListThread);
addThread.detach();
cout<< "begin addThread" <
QThreadPool tp;
tp.setMaxThreadCount(20);
cout<< "begin threadPool" <
{if(!myList.empty())
{
MyString tempMyString=myList.front();
tp.start(newRun(tempMyString));
myMutex.lock();
myList.pop();
myMutex.unlock();
}else{if(addThreadIsEnd)
{break;
}else{
QThread::msleep(10);
}
}
}
cout<< "end main,list size:" << myList.size() <
}voidmakeListThread()
{stringa;
MyString tempMyString;for(int i=0;i<10000;i++)
{
QThread::msleep(0);
a=to_string(i);
tempMyString.valueStr=a;
myMutex.lock();
myList.push(tempMyString);
myMutex.unlock();
}
addThreadIsEnd= true;
cout<< "end addThread" <
}
5、模型
6、其他说明
6.1、假设线程池大小有n个,那么这n个线程在线程池初始化的时候就已经定了,即n个线程id是恒定的,队列永远由这n个线程消费
6.2、std::queue非线程安全,同时往队列加任务、取任务可能会触发线程安全问题;同时删除头任务、访问头任务也可能会触发线程安全问题,需要加线程锁
6.3、tp.start(new Run(tempMyString));这里new了一个没有指针指向的Runnable对象,在哪里回收的呢?Run.setAutoDelete(true)自动回收
qt下编写linux消息队列,C++11消息队列 + Qt线程池 + QRunnable执行任务简单模型相关推荐
- 用Linux / C实现基于自动扩/减容线程池+epoll反应堆检测沉寂用户模型的服务器框架(含源码)
用Linux/ C实现基于自动扩/减容线程池+epoll反应堆模型的服务器框架 前言 服务器端源码 客户端源码 自定义库 helper.c 和 helper.h helper.c helper.h M ...
- 基于Linux的C++轻量级web服务器/webserver/httpserver——线程池
1. 背景 什么是线程池? 线程池技术是池化技术的一种.除了线程池,还是内存池.连接池等其他池化技术.打个比方来说,线程池是将若干个随时可以执行任务的线程放在"池子"这种容器中,当 ...
- 27.Linux网络编程socket变成 tcp 高并发 线程池 udp
好,咱们开始上课了,从今天开始咱们连续讲 8 天的,网络编程这个还是在linux环境下去讲,咱们先看一下咱们这 8 天都讲什么东西,跟大家一块来梳理一下,你先有个大概的印象,这些你也不要记,那么网络编 ...
- 线程池 c linux 编程,关于c++:linux-c编程之高效线程池如何实现无琐化
大多数线程池实现都离不开锁的应用,如互斥量pthread_mutex*联合条件变量pthread_cond*.家喻户晓,锁的应用对于程序性能影响较大,尽管现有的pthread_mutex*在锁的申请与 ...
- qtdll在linux系统运行,在QT下编写带DLL的程序
注:我的工作目录是: D:\My Documents\MyProject 一.运行QtCreator 1.新建工程/选择C++ Library 这里设计被调用的DLL 下一步: 然后输入类名:它会生 ...
- squish用于qt下的linux
官方文档(英文) https://doc.froglogic.com/squish/latest/ qt主要是4.1.1节 安装可以看 http://mp.weixin.qq.com/s?__biz= ...
- c 中服务器多次接受消息,c/s模拟高并发服务器端线程池接收问题
//4.开启一个新线程不断接受用户的连接请求 ThreadPool.QueueUserWorkItem(new WaitCallback(skObj => { Socket skConnP = ...
- linux 查看java进城_linux查看java进程|线程池信息
1.根据端口号57638查看对应进程pid/name=1463/java netstat -apn | grep 57638 tcp 0 0 ::ffff:172.20.5. ...
- SpringBoot 引入线程池+Queue缓冲队列实现高并发下单业务
点击关注公众号,利用碎片时间学习 主要是自己在项目中(中小型项目) 有支付下单业务(只是办理VIP,没有涉及到商品库存),目前用户量还没有上来,目前没有出现问题,但是想到如果用户量变大,下单并发量变大 ...
最新文章
- Python几种主流框架
- eclipse中tomcat启动不了_Spring Boot中Tomcat是怎么启动的
- [一文一命令]tail命令详解
- 创建型模式—单例模式
- WinXP中快捷方式加箭头
- ASP.NET 2.0 之 Master Page 学习笔记
- word文档中插入特殊字符
- 孤独终老和勉强结婚,你会选什么?
- LIST函数JAVA特点_Java 集合系列 07 List总结(LinkedList, ArrayList等使用场景和性能分析)...
- Kafka详解与总结(七)-Kafka producer拦截器(interceptor)
- struts2 拦截器返回值问题
- 剑网三手游哪个服务器人多稳定,“剑网三”手游开服后,我听了半个小时的骂街...
- 德州农工大学计算机硕士申请,2019至领留学获德州农工大学TAMU电子工程硕士ECE录取...
- HTML代码单元格内标题置顶,css表格标题怎么设置位置?
- 如何解决浏览器的兼容性
- 微信小程序--分享并设置分享链接的有效时间
- unity 环境光、模型、材质发绿,绿的发光
- kotlin完成 Code War 题目 解析分子公式
- linux wget
- 学术不端网查重靠谱吗_学术不端网知网查重万方哪一个权威
热门文章
- R语言ggplot2可视化增加轴标签(ticks)和轴标题(title)之间的距离实战
- R构建KNN分类器实战
- 影像组学视频学习笔记(42)-影像组学特征提取问题解决过程复现、Li‘s have a solution and plan.
- R语言数据结构之数据框
- luci网页shell_openwrt luci web分析
- IBS illustrator for the presentation and visualization of biological sequences 中山大学
- Assembly of long, error-prone reads using repeat graphs 使用重复图组装长且容易出错的读操作
- 实验七:层叠样式表(二)
- Python基础总结(1)
- 解决问题:chmod: changing permissions of ‘...‘: Read-only file system和/dev/sda1 is write-protected but ex