| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> QT/C++高级编程(上) -> 正文阅读 |
|
[C++知识库]QT/C++高级编程(上) |
本编文章主要展示用qt来实现进程,线程。 一.进程 ? ? 如何在QT中启动一个新的进程? ? ? ? ? 方法一:1.窗体中设置pushButton,按钮转到槽 ? ? ? ? ? ? ? ? ? ? ??2.在头文件中添加进程类 : #include<QProcess> ? ? ? ? ? ? ? ? ? ? ? 3.槽函数中打开想要打开的进程,可以是windows中的进程,也可以说是自己编译的可执行程序。? ? ? ? ? ? ? ? ? ? ? ? ? 例如:QProcess::execute("NotePad"); //打开记事 ???????????????????????????????????QProcess::execute("MSPAINT"); //打开画图 ????????????????????????注意:若想打开自定义程序,需将对应的dll类添加Windowsc:/windows/system32中。 ? ? ? ? 方法二:1.窗体中设置pushButton,按钮转到槽 ? ? ? ? ? ? ? ? ? ? ? ?2.在头文件中添加进程类 : #include<QProcess> ? ? ? ? ? ? ? ? ? ? ? ?3.槽函数中先定义一个进程对象,设置要启动的进程,用start方法启动。 ? ? ? ? ? ? ? ? ? ? ? ? 例如:static QProcess process;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?process.setProgram("NotePad"); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?process.start(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?注意:加上static,进程对象加载进程时,当进程对象销毁后,被加载的进程就会被杀死。 二.线程 ? ? ? ? QT中为什么要线程? ? ? ? ? ? ? ? ? 如果界面中某个成员函数进行比较耗时的操作时,界面可能出现卡顿的现象。这时就需要创建一个线程,让线程处理耗时的操作,当前进程返回正常值。(用线程类定义一个对象时,该对象就是一个线程) ? ? ? ? QT工程中使用线程,需要以下要素:1.需要一个线程派生类对象 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.在线程子类中重写线程执行函数run(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.启动线程 。对象.start(); ? ? ? ? 注意:线程基类QThread无法直接声明对象,需要定义一个线程子类。 ? ? ? ? 例题:在qt中创建一个线程循环打印 “hello” ? ? ? ? ? ? ? ? 步骤:1.在qt工程中添加新文件 C++ Header File 和 C++ Source File ? ? ? ? ? ? ? ? ? ? ? ? ? ?2. C++ Header File 中: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #include<QThread>? //线程基类 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? class myThread : public QThread ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Q_OBJECT //支持信号和槽的机制 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?public: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? explicit? myThread(QObject *parent = 0); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //不需要析构函数,线程占用进程空间 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? signals : ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? void doDone(); //自定义信号函数,用于给进程发信号 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? protected : ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? void run(); //重写线程执行函数 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3.C++ Source File 中 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #include"mythread.h" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #include<QDebug> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? myThread::myThread(Qobject *parent):QThread(parent);//初始化 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? void myThread::run() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int i; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? for(i=0;i<10;i++) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {???????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? QThread::sleep(1); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? qDebug()<<"hello\r\n"; ????????????????????????????????????????????????} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? emit doDone(); //给进程发信号 ????????????????????????????????????????} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4.界面添加button,转到槽 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? thread->start(); //启动线程 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?5.头文件中,声明线程指针,声明doDone信号对应的槽函数 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? private : ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? myThread * thread; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? private slots: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? void threadDoneSloat(); //用来回收线程资源 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?6.窗体构造函数中将doDone信号和自定义槽函数关联起来 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? thread = new myThread(this); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? connect(thread, SIGNAL(doDone()),this,SLOT(threadDoneSlots)); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 7.定义.h中声明的槽函数 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? thread -> quit(); //退出线程 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? thread->wait();//回收线程退出状态值 ? ? ? ? ? ? ? ? 总体思想:点下button时启动线程,线程结束时发送doDone信号主进程,将doDone信号和槽关联起来,当接受到信号时执行槽函数,槽函数进行回收资源。线程执行函数不需要自己调用,线程启动时由系统自行调用。 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年2日历 | -2025/2/5 22:46:46- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |