Qt之锁
mythread.h:
#ifndef MYTHREAD_H
#define MYTHREAD_H #include <QObject>
#include<QMutex>
class MyThread : public QObject
{
Q_OBJECT
public:
explicit MyThread(QMutex *_q,int *_x,QObject *parent = nullptr);
signals:
public slots:
void working();
private:
int * x;
QMutex *q;
}; #endif // MYTHREAD_H
mythread.cpp:
#include "mythread.h"
#include<QDebug>
#include<QMutex>
MyThread::MyThread(QMutex *_q,int* _x,QObject *parent)
: QObject(parent),x(_x),q(_q)
{ }
void MyThread::working()
{
qDebug()<<"线程启动了"<<"object_name"<<this->objectName()<<endl;
for(int i=0;i<500000;i++)
{
q->lock();
int temp=*x;
temp++;
*x=temp;
q->unlock();
}
qDebug()<<"线程结束了"<< "x="<<*x<<"object_name"<<this->objectName()<<endl;
}
widget.h:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include"mythread.h"
#include<QThread>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QMutex *mutex=0,int _value=0,QWidget *parent = 0);
~Widget();
private:
int value;
MyThread *t1;
MyThread *t2;
QThread *w1;
QThread *w2;
QMutex *mutex;
}; #endif // WIDGET_H
widget.cpp:
#include "widget.h"
#include "mythread.h"
Widget::Widget(QMutex *mutex,int _value,QWidget *parent)
: QWidget(parent),value(_value)
{
mutex=new QMutex;
t1=new MyThread(mutex,&value);
t2=new MyThread(mutex,&value);
w1=new QThread(this);
w2=new QThread(this);
t1->setObjectName("t1");
t2->setObjectName("t2");
t1->moveToThread(w1);
t2->moveToThread(w2); connect(w1,SIGNAL(started()),t1,SLOT(working()));
connect(w2,SIGNAL(started()),t2,SLOT(working()));
connect(w1,SIGNAL(finished()),t1,SLOT(deleteLater()));
connect(w2,SIGNAL(finished()),t2,SLOT(deleteLater()));
w1->start();
w2->start();
} Widget::~Widget()
{
w1->quit();
w1->wait();
w2->quit();
w2->wait();
delete mutex;
}
效果:
其中这所可以找个托管的:
效果:
智能锁一般应用于比较短的函数:
如果写成:
就锁不住了。
Qt之锁的更多相关文章
- Qt - 锁屏界面加虚拟小键盘
一.实现效果 鼠标点击"密码输入栏",弹出虚拟键盘,输入锁屏密码后,点击虚拟键盘外部区域,则会隐藏虚拟键盘,再点击登录,成功进入主界面. 二.虚拟键盘-程序设计 2.1 frmNu ...
- Qt中暂停线程的执行(主线程和工作线程共用一把锁,一旦主线程将它锁上,工作线程就无法运行了,这也是一个办法)
在线程中定义一个信号量: QMutex pause; 把run()函数中循环执行的部分用信号量pause锁住: void run() { while(1) { pause.lock ...
- Linux Qt使用POSIX多线程条件变量、互斥锁(量)
今天团建,但是文章也要写.酒要喝好,文要写美,方为我辈程序员的全才之路.嘎嘎 之前一直在看POSIX的多线程编程,上个周末结合自己的理解,写了一个基于Qt的用条件变量同步线程的例子.故此来和大家一起分 ...
- Qt 实现超时锁屏
最近使用Qt实现超时锁屏的功能(工控机触摸屏),当手长时间不触摸屏幕的时候,程序超时会显示锁屏窗口. 一.效果 主窗口超时显示锁屏窗口: 系统窗口超时显示锁屏窗口: 二.实现思路 首先开启一个线程用于 ...
- 树莓派开发笔记(十七):树莓派4B+上Qt多用户连接操作Mysql数据库同步(单条数据悲观锁)
前言 安装了mysq数据库,最终时为了实现在一个树莓派上实现多用户多进程操作的同步问题,避免数据并发出现一些错误,本篇安装了远程服务并且讲述了使用Qt进行悲观锁for update操作,命令行进行 ...
- qt qml 九宫格划指锁屏视图
九宫格划指锁屏视图Lisence: MIT, 请保留本文档说明Author: surfsky.cnblogs.com 2015-02 [先看效果] [下载] http://download.csdn. ...
- Qt优雅地结束线程(两种方法都是用Mutex锁住bool变量进行修改,然后由bool变量控制耗时动作的退出,即正常退出)
如果一个线程运行完成,就会结束.可很多情况并非这么简单,由于某种特殊原因,当线程还未执行完时,我们就想中止它.不恰当的中止往往会引起一些未知错误.比如:当关闭主界面的时候,很有可能次线程正在运行,这时 ...
- Qt 多线程和网络编程学习
一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...
- 记录Qt的一个诡异Bug
公司的一款项目,在迭代开发阶段,突然发现运行速度越来越慢,界面切换卡顿时间在2秒以上.经过和某个不卡版本的对比,惊奇的发现程序二进制都一模一样,就几个图片资源和脚本不一样.经过差不多一天的排查,发现是 ...
随机推荐
- 分布式:分布式事务(CAP、两阶段提交、三阶段提交)
1 关于分布式系统 1.1 介绍 我们常见的单体结构的集中式系统,一般整个项目就是一个独立的应用,所有的模块都聚合在一起.明显的弊端就是不易扩展.发布冗重.服务治理不好做. 所以我们把整个系统拆分成若 ...
- 【LeetCode】171. Excel Sheet Column Number 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目大意 解题方法 Java解法 Python解法 日期 [LeetCode] 题 ...
- 【LeetCode】448. Find All Numbers Disappeared in an Array 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 方法一:暴力求解 方法二:原地变负做标记 方法三:使用set ...
- 【LeetCode】1002. Find Common Characters 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 日期 题目地址:https://leetcod ...
- 【剑指Offer】复杂链表的复制 解题报告(Python)
[剑指Offer]复杂链表的复制 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...
- Mysql 层级无限嵌套
1.新建测试数据 新建channel表 DROP TABLE IF EXISTS channel; CREATE TABLE channel ( id INT(11) NOT NULL AUTO_IN ...
- 第九届河南理工大学算法程序设计大赛 正式赛L:最优规划(最小生成树)
单测试点时限: 1.0 秒 内存限制: 512 MB 有很多城市之间已经建立了路径,但是有些城市之间没有路径联通.为了联通所有的城市,现在需要添加一些路径,为了节约,需要满足添加总路径是最短的. 输入 ...
- SuperPixel
目录 SLIC Superpixel algorithm 距离函数的选择 代码 Gonzalez R. C. and Woods R. E. Digital Image Processing (For ...
- Chapter 6 Graphical Representation of Causal Effects
目录 6.1 Causal diagrams 6.2 Causal diagrams and marginal independence 6.3 Causal diagrams and conditi ...
- Understanding Black-box Predictions via Influence Functions
目录 概 主要内容 样本重要性分析 样本摄动对损失的影响 高效计算 共轭梯度 随机估计 一些应用 附录 (1)的证明 Koh P W, Liang P. Understanding black-box ...