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. STC8PROG - Linux下的 STC8G STC8H 烧录工具

    STC8PROG - Linux下的 STC8G STC8H 烧录工具 动机 在Linux下用 VSCode + PlatformIO 做开发, 因为VSCode的界面字体代码提示, 以及自定义的类J ...

  2. python 安装模块报错 response.py", line 302, in _error_catcher

    python 安装模块报错 Exception:Traceback (most recent call last): File "/usr/share/python-wheels/urlli ...

  3. 【LeetCode】592. Fraction Addition and Subtraction 解题报告(Python)

    [LeetCode]592. Fraction Addition and Subtraction 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuem ...

  4. codeforce-601A. The Two Routes(最短路)

    题意: 给你N个点表示N个站,有汽车和火车,汽车只能走公路,火车只能走铁路. 然后给你M条双向路,代表这两个点之间有铁路连接. 然后告诉你如果两个点之间没有铁路,那么就是公路连接. 问你汽车和火车都到 ...

  5. 『学了就忘』vim编辑器基础 — 97、vim使用技巧

    目录 1.在vim中导入其他文件内容或命令结果 (1)导入其他文件内容 (2)在vim中执行系统命令 (3)导入命令结果 2.设定快捷键 3.字符替换 4.多文件打开 vim使用技巧,就是vim编辑器 ...

  6. 慢 SQL 优化

    # 导致SQL执行慢的原因 1. 硬件问题.如网络速度慢,内存不足,I/O吞吐量小,磁盘空间满了等. 2. 没有索引或者索引失效.(一般在互联网公司,DBA会在半夜把表锁了,重新建立一遍索引,因为当你 ...

  7. Service有多个实现类,它怎么知道该注入哪个ServiceImpl类

    方法一:Controller中注入service的时候使用@Autowired自动注入,@Qualifier("beanId")来指定注入哪一个. 方法二:Controller中注 ...

  8. 【操作系统】bat文件 系统找不到文件路径

    我直接使用bat文件发现我要删除的文件夹还在 在bat文件最后添加pause指令查看发现报错:系统找不到文件路径 原因:路径包括中文,显示乱码(因为txt另存为bat时用量utf-8编码) 解决方法: ...

  9. Git从远程仓库克隆

    首先,登陆GitHub,创建一个新的仓库,名字叫gitskills 勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个READM ...

  10. Swoole 协程使用示例及协程优先级

    示例一: Co::set(['hook_flags'=> SWOOLE_HOOK_ALL]); Co\run(function () { go(function() { var_dump(fil ...