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之锁的更多相关文章

  1. Qt - 锁屏界面加虚拟小键盘

    一.实现效果 鼠标点击"密码输入栏",弹出虚拟键盘,输入锁屏密码后,点击虚拟键盘外部区域,则会隐藏虚拟键盘,再点击登录,成功进入主界面. 二.虚拟键盘-程序设计 2.1 frmNu ...

  2. Qt中暂停线程的执行(主线程和工作线程共用一把锁,一旦主线程将它锁上,工作线程就无法运行了,这也是一个办法)

    在线程中定义一个信号量: QMutex pause; 把run()函数中循环执行的部分用信号量pause锁住:   void run()   {   while(1)   {   pause.lock ...

  3. Linux Qt使用POSIX多线程条件变量、互斥锁(量)

    今天团建,但是文章也要写.酒要喝好,文要写美,方为我辈程序员的全才之路.嘎嘎 之前一直在看POSIX的多线程编程,上个周末结合自己的理解,写了一个基于Qt的用条件变量同步线程的例子.故此来和大家一起分 ...

  4. Qt 实现超时锁屏

    最近使用Qt实现超时锁屏的功能(工控机触摸屏),当手长时间不触摸屏幕的时候,程序超时会显示锁屏窗口. 一.效果 主窗口超时显示锁屏窗口: 系统窗口超时显示锁屏窗口: 二.实现思路 首先开启一个线程用于 ...

  5. 树莓派开发笔记(十七):树莓派4B+上Qt多用户连接操作Mysql数据库同步(单条数据悲观锁)

    前言   安装了mysq数据库,最终时为了实现在一个树莓派上实现多用户多进程操作的同步问题,避免数据并发出现一些错误,本篇安装了远程服务并且讲述了使用Qt进行悲观锁for update操作,命令行进行 ...

  6. qt qml 九宫格划指锁屏视图

    九宫格划指锁屏视图Lisence: MIT, 请保留本文档说明Author: surfsky.cnblogs.com 2015-02 [先看效果] [下载] http://download.csdn. ...

  7. Qt优雅地结束线程(两种方法都是用Mutex锁住bool变量进行修改,然后由bool变量控制耗时动作的退出,即正常退出)

    如果一个线程运行完成,就会结束.可很多情况并非这么简单,由于某种特殊原因,当线程还未执行完时,我们就想中止它.不恰当的中止往往会引起一些未知错误.比如:当关闭主界面的时候,很有可能次线程正在运行,这时 ...

  8. Qt 多线程和网络编程学习

    一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...

  9. 记录Qt的一个诡异Bug

    公司的一款项目,在迭代开发阶段,突然发现运行速度越来越慢,界面切换卡顿时间在2秒以上.经过和某个不卡版本的对比,惊奇的发现程序二进制都一模一样,就几个图片资源和脚本不一样.经过差不多一天的排查,发现是 ...

随机推荐

  1. Elasticsearch 和 solr 的区别

    背景:它们都是基于Luence搜索服务器基础之上开发的一款优秀高性能的企业级搜索服务器.也都是基于分词技术构建的倒排索引的方式进行查询 开发语言:java 诞生时间: solr  :2004年 es ...

  2. LocalDateTime与Date相互转换

    LocalDateTime 转 Date LocalDateTime localDateTime=LocalDateTime.now() Date date = Date.from(localDate ...

  3. python3实战之字幕vtt与字母srt的相互转换

    关于 0.本文将介绍一个字幕格式vtt与srt相互转换的py脚本. 1.代码大部分出自: https://www.cnblogs.com/BigJ/p/vtt_srt.html 2.但是自己针对上面的 ...

  4. 【LeetCode】81. Search in Rotated Sorted Array II 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/search-in ...

  5. 【LeetCode】876. Middle of the Linked List 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 使用哑结点 不使用哑结点 日期 题目地址:https ...

  6. Pikachu漏洞练习-SQL-inject(持续更新)

    本来在bup中repeater模式可以多次测试,但不知为何总是出错 这里把我们想查询的数据库和版本进行联合查询,放包,页面回显数据库名称和版本分别为pikachu,5.7.26 数据库版本大于5那么i ...

  7. Handing Incomplete Heterogeneous Data using VAEs

    目录 概 主要内容 ELBO 网络结构 不同的数据 HI-VAE 代码 Nazabal A., Olmos P., Ghahramani Z. and Valera I. Handing incomp ...

  8. Mysql客户端的安装

    Mysql数据库(简称)属于C/S架构,正常工作中一般都会提供服务端,我们只需要安装客户端进行查询修改数据等操作即可. 正常工作中不管是测试人员或者开发人员,一般数据库的管理员(测试负责人或者开发负责 ...

  9. [opencv]二维码识别开发流程及问题复盘总结

    项目复盘总结 开发需求: 在桌面机器人(向下俯视)摄像头拍摄到的图像中做条形码识别与二维码识别. 条形码在图像固定位置,二维码做成卡片的形式在固定区域内随意摆放. 开发环境及相关库:ubuntu 18 ...

  10. UML的定义和组成详细介绍

    目录 1.UML 1.1概述 1.2 UML是一种建模语言 1.3 UML语言包含三方面 2.UML支持软件体系结构建模 2.1 逻辑视图 2.2 实现(开发)视图 2.3 部署视图 2.4 过程视图 ...