lv20 QT进程线程编程

知识点:启动进程 ,线程 ,线程同步互斥

1 启动进程

应用场景:通常在qt中打开另一个程序

process模板

QString program = “/bin/ls";
QStringList arguments;
arguments << "-l" << “-a";QProcess *myProcess = new QProcess(parent);
myProcess->execute(program, arguments);

示例:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QLineEdit>
#include <QPushButton>
#include <QFileDialog>
#include <QProcess>
#include <QStringList>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();
public slots:void showfile(){QString filename = QFileDialog::getOpenFileName();le->setText(filename);QStringList arg = {filename};QProcess ppp;ppp.execute("notepad", arg);}private:QLineEdit *le;QPushButton *pb;
};#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include <QVBoxLayout>Widget::Widget(QWidget *parent): QWidget(parent)
{le = new QLineEdit;pb = new QPushButton("showtxt");QVBoxLayout *vbox = new QVBoxLayout;vbox->addWidget(le);vbox->addWidget(pb);setLayout(vbox);connect(pb, SIGNAL(clicked(bool)), this, SLOT(showfile()));
}Widget::~Widget()
{}

效果在qt中使用文本编辑器打开一个文本。 

2 线程

应用场景:启动一个线程和进程来辅助程序

线程:

class WorkerThread : public Qthread{
Q_OBJECTvoid run() {/* ... here is the expensive or blocking operation ... */emit resultReady(result);}
signals:void resultReady(const QString &s);};
WorkerThread   x;
x.start();

  • void run()方法:这是QThread的一个虚函数,你需要在子类中重写它以实现线程的任务。当调用线程的start()方法时,这里的代码将在新的线程中执行。

  • void resultReady(const QString &s)信号:这是一个自定义信号,当线程完成工作并有结果可供返回时,将通过emit关键字发射这个信号。

  • QT是信号驱动、或者异步驱动的框架,平时app需要执行到a.exec()才会执行

 

双线程示例:一个线程打印数组,一个线程排序数组

thread_show.h(继承QThread类)

#ifndef THREAD_SHOW_H
#define THREAD_SHOW_H#include <Qthread>
#include <QDebug>
#include <QMutex>class thread_show : public QThread
{Q_OBJECT
public:thread_show(char *p):m_arr(p){}void run()   //这是QThread的一个虚函数(qt中斜线表示),你需要在子类中重写它以实现线程的任务。当调用线程的start()方法时,这里的代码将在新的线程中执行。{while(1){//lockqDebug()<<m_arr;sleep(1);}}
private:char *m_arr;};#endif // THREAD_SHOW_H

thread_show.cpp(重写构造函数)

#include "thread_show.h"/*
thread_show::thread_show()
{}
*/

thread_rev.h

#ifndef THREAD_REV_H
#define THREAD_REV_H#include <QThread>class thread_rev : public QThread
{Q_OBJECT
public:thread_rev(char *p):m_arr(p){}  //构造时,直接赋值效率高void run(){while(1){for(int i=0; i<5; i++){m_arr[i] ^= m_arr[9-i];m_arr[9-i] ^= m_arr[i];m_arr[i] ^= m_arr[9-i];}}}
private:char *m_arr;
};#endif // THREAD_REV_H

thread_rev.cpp(重写构造函数)

#include "thread_rev.h"/*
thread_rev::thread_rev()
{}
*/

main.cpp

#include "widget.h"
#include <QApplication>
#include "thread_rev.h"
#include "thread_show.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);char arr[] = "0123456789";thread_show t1(arr);  //打印thread_rev t2(arr);   //翻转数组t1.start();t2.start();return a.exec();
}

 效果:两个线程同时操作,打印出来的数组无规律

 

3 线程互斥

官方示例

QSemaphore :QSemaphore sem(5);      // sem.available() == 5sem.acquire(3);         // sem.available() == 2sem.acquire(2);         // sem.available() == 0sem.release(5);         // sem.available() == 5sem.release(5);         // sem.available() == 10sem.tryAcquire(1);      // sem.available() == 9, returns truesem.tryAcquire(250);    // sem.available() == 9, returns falseQMutex ://lockerQMutex mutex;void method1(){mutex.lock();mutex.unlock();}void method2(){mutex.lock();mutex.unlock();}

实验示例:

thread_show.h

#ifndef THREAD_SHOW_H
#define THREAD_SHOW_H#include <Qthread>
#include <QDebug>
#include <QMutex>class thread_show : public QThread
{Q_OBJECT
public:thread_show(char *p, QMutex *l):m_arr(p), m_arrlock(l){}void run()   //这是QThread的一个虚函数(qt中斜线表示),你需要在子类中重写它以实现线程的任务。当调用线程的start()方法时,这里的代码将在新的线程中执行。{while(1){m_arrlock->lock();qDebug()<<m_arr;m_arrlock->unlock();sleep(1);}}
private:char *m_arr;QMutex *m_arrlock;};#endif // THREAD_SHOW_H

thread_show.cpp

#include "thread_show.h"/*
thread_show::thread_show()
{}
*/

thread_rev.h

#ifndef THREAD_REV_H
#define THREAD_REV_H#include <QThread>
#include <QMutex>class thread_rev : public QThread
{Q_OBJECT
public:thread_rev(char *p, QMutex *l):m_arr(p), m_arrlock(l){}void run(){while(1){m_arrlock->lock();for(int i=0; i<5; i++){m_arr[i] ^= m_arr[9-i];m_arr[9-i] ^= m_arr[i];m_arr[i] ^= m_arr[9-i];}m_arrlock->unlock();}}
private:char *m_arr;QMutex *m_arrlock;};#endif // THREAD_REV_H

thread_rev.cpp

#include "thread_rev.h"/*
thread_rev::thread_rev()
{}
*/

main.cpp

#include "widget.h"
#include <QApplication>
#include "thread_rev.h"
#include "thread_show.h"
#include <QMutex>int main(int argc, char *argv[])
{QApplication a(argc, argv);char arr[] = "0123456789";QMutex arr_lock;thread_show t1(arr,&arr_lock);  //打印thread_rev t2(arr,&arr_lock);   //翻转数组t1.start();t2.start();return a.exec();
}

  效果:两个线程同时操作,打印出来的数组均为排序后的结果,排序中不会受到干扰

4 线程同步

目的:实现一个线程获取资源需要等另一个线程释放资源。

thread_hello.h

#ifndef THREAD_HELLO_H
#define THREAD_HELLO_H#include <QSemaphore>
#include <QThread>
#include <QDebug>class thread_hello : public QThread
{Q_OBJECT
public:thread_hello(QSemaphore *s):sem(s){ }void run(){while(1){qDebug()<<"hello";sleep(1);//Vsem->release();}}
private:QSemaphore *sem;
};#endif // THREAD_HELLO_H

thread_hello.cpp

#include "thread_hello.h"/*
thread_hello::thread_hello()
{}
*/

thread_world.h

#ifndef THREAD_WORLD_H
#define THREAD_WORLD_H#include <QThread>
#include <QDebug>
#include <QSemaphore>class thread_world : public QThread
{Q_OBJECT
public:thread_world(QSemaphore *s):sem(s){ }void run()  //字体歪的就是虚函数{while(1){//Psem->acquire();qDebug()<<"world";}}
private:QSemaphore *sem;
};#endif // THREAD_WORLD_H

thread_world.cpp

#include "thread_hello.h"/*
thread_hello::thread_hello()
{}
*/

main.cpp

#include <QCoreApplication>
#include "thread_hello.h"
#include "thread_world.h"
#include <QSemaphore>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QSemaphore sem;thread_hello hello(&sem);thread_world world(&sem);hello.start();world.start();return a.exec();
}

效果,hello先打印,才会有world。 

 

综合示例:实现两个进度条在下载

mythread1.h

#ifndef MYTHREAD1_H
#define MYTHREAD1_H#include <QThread>class myThread1 : public QThread
{Q_OBJECT
signals:downloaded(int);
public:myThread1();void run(){for(int i=0;i<100; i++){//p1->setValue(i);emit downloaded(i);QThread::sleep(2);}}
};#endif // MYTHREAD1_H

mythread1.cpp

#include "mythread1.h"myThread1::myThread1()
{}

mythread2.h

#ifndef MYTHREAD2_H
#define MYTHREAD2_H#include <QThread>class myThread2 : public QThread
{Q_OBJECT
signals:downloaded(int);
public:myThread2();void run(){for(int i=0;i<100; i++){//p1->setValue(i);emit downloaded(i);QThread::sleep(1);}}
};#endif // MYTHREAD2_H

mythread1.cpp

#include "mythread2.h"myThread2::myThread2()
{}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QProgressBar>
#include "mythread2.h"
#include "mythread1.h"class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();
private:QProgressBar *p1, *p2;myThread1 *t1;myThread2 *t2;
};#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include <QVBoxLayout>
#include <QThread>Widget::Widget(QWidget *parent): QWidget(parent)
{p1 = new QProgressBar;p2 = new QProgressBar;QVBoxLayout *vbox = new QVBoxLayout;vbox->addWidget(p1);vbox->addWidget(p2);setLayout(vbox);t1 = new myThread1;t2 = new myThread2;connect(t1, SIGNAL(downloaded(int)), p1, SLOT(setValue(int)));connect(t2, SIGNAL(downloaded(int)), p2, SLOT(setValue(int)));t1->start();t2->start();#if 0for(int i=0;i<100; i++){p1->setValue(i);QThread::sleep(1);}for(int i=0;i<100; i++){p2->setValue(i);QThread::sleep(2);}
#endif
}Widget::~Widget()
{}

注:

downloaded(不需要实现,qt实现的不是函数)

emit发送一个信号

exit 发送信号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/505039.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

京东云硬钢阿里云:承诺再低10%

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 阿里云刚刚宣布史上最大规模的全线产品降价20%&#xff0c;这热度还没过&#xff0c;京东云当晚就喊话&#xff1a;“随便降、比到底!&#xff0c;全网比价&#xff0c;击穿低价&#xff0c;再低10%”&#xff0c;并…

网页版图像处理软件开发服务:助您项目在市场竞争中脱颖而出

在当今数字化时代&#xff0c;图像处理在各个行业中扮演着重要的角色&#xff0c;虎克专注于提供定制化的网页版图像处理软件开发服务&#xff0c;为您的项目保驾护航。 1.网页版图像处理软件的定制化需求 1.1行业特定功能 针对不同的业务需求&#xff0c;深入了解行业特点&…

IEEE754标准的c语言阐述,以及几个浮点数常量

很多年前&#xff0c;调研过浮点数与整数之间的双射问题&#xff1a; win7 intel x64 cpu vs2013 c语言浮点数精度失真问题 最近重新学习了一下IEEE754标准&#xff0c;也许实际还有很多深刻问题没有被揭示。 计算机程序设计艺术&#xff0c;据说这本书中也有讨论。 参考&…

基于ssm疫情期间高校防控系统+vue论文

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;学生信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广大…

用电商API,轻松获取淘宝商品数据!

我们进入到淘宝商品数据页面&#xff0c;按F12打开开发者模式&#xff0c;对页面进行观察&#xff0c;我们发现淘宝页面是Ajax方式加载的&#xff0c;而且它的接口参数很复杂且没有固定的规律&#xff0c;但是Selenium又被淘宝反爬限制了&#xff0c;所以我们不能使用Ajax来获取…

C/C++内存管理及内存泄漏详解

目录 C/C内存分布 C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free C内存管理方式 new/delete操作内置类型 new和delete操作自定义类型 operator new与operator delete函数 new和delete的实现原理 内置类型 自定义类型 内存泄漏 概念 内存泄漏分类 ⭐…

探索数据宇宙:深入解析大数据分析与管理技术

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

多线程(进阶四:线程安全的集合类)

目录 一、多线程环境使用ArrayList 二、多线程环境使用队列 三、多线程环境使用哈希表 1、HashMap 2、Hashtable 3、ConcurrentHashMap (1)缩小了锁的粒度 (2)充分使用了CAS原子操作&#xff0c;减少一些加锁 (3)针对扩容操作的一些优化&#xff08;化整为零&#xff…

【C初阶】预处理

前言&#xff1a;在本文中&#xff0c;我将系统的整理一下C语言关于预处理部分的语法&#xff0c;便于整理与回归。 1.预定义符号 在C语言中&#xff0c;C标准提供里一些C预定义符号&#xff0c;在预处理期间完成&#xff0c;可以直接使用。 有如下几个符号&#xff1a; 2.#…

MQL5学习之RSI指标编写

研究MT5时发现MQL5这个指标编写功能很强大&#xff0c;应该是碾压国内所有的指标系统&#xff0c;不过这个东西相对复杂很多&#xff0c;比通达信公式不知复杂几许&#xff0c;看起来和C语法接近&#xff0c;倒是比较适合自己。试着玩一下&#xff0c;发现还是有点难度的。索性…

Snagit 2024:让你的屏幕活动瞬间变得生动有力 mac/win版

Snagit 2024 屏幕录制与截图软件是一款功能强大的工具&#xff0c;专为现代用户设计&#xff0c;以满足他们在工作、学习和娱乐中对屏幕内容捕捉和分享的需求。这款软件结合了屏幕录制和截图功能&#xff0c;为用户提供了一种高效、便捷的方式来捕捉屏幕上的精彩瞬间。 Snagit…

相关知识1111

一、 店铺编号和相关负责人 1、天猫兄弟、锦格 京东凡越 福林哥 如萍姐 2、京东锦格 天猫凡越 林森 雷佳华 3、天猫从简 京东从简 孔哥 4、抖音锦格 拼多多凡越 鸿哥 不知道哪个店铺编号&#xff1a;0 二、天猫京东聊天界面快捷搜索商品 1、 天猫只能根据标题搜索 2、京东是…