【Qt学习笔记】8.Qt中的多线程

一、界面线程与工作线程

GUI程序的主线程:

GUI的用户输入主要来自鼠标、键盘,称为事件。

处理事件的主循环,称为 事件循环。 这个用于处理各种界面的线程,称为 界面线程

GUI界面卡死

所有的事件处理函数(slots)都应该迅速返回,否则主界面会卡死

例如:鼠标点击一个按钮后,这个处理函数要尽快的返回。在它处理期间,界面是卡死的。(因为此函数处于事件循环中)

解决:把长时间的任务放到另一个线程(工作线程)中来完成,保持界面处于活动的状态。

二、定时器(Timer)

定时器用于实现定时操作,如:

每3秒钟自动保存一次

每500毫秒闪烁一次

每1秒刷新显示一次界面

使用方法:

1:重写virtual void timerEvent( QTimerEvent* event );

2:启动定时器,指定时间间隔(毫秒)

m_timerld = startTimer(500);

小练习:

实现一个文字时钟,显示系统当前时间

class Test8_1a_12_8 : public QMainWindow
{
    Q_OBJECT

public:
    Test8_1a_12_8(QWidget *parent = Q_NULLPTR);
	virtual void timerEvent(QTimerEvent* event);		//重写该函数(继承自QObject)

private:
    Ui::Test8_1a_12_8Class ui;
	int m_timerId;	//每个Timer有一个id
};

Test8_1a_12_8::Test8_1a_12_8(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);
	m_timerId = startTimer(500);
}

void Test8_1a_12_8::timerEvent(QTimerEvent* event)
{
	//可以有多个定时器,每个定时器有不同的处理
	if ( event->timerId() == m_timerId )
	{
		QTime now = QTime::currentTime();
		QString text = now.toString("HH:mm:ss");
		ui.lineEditTime->setText(text);
	}
}

效果:

关于定时器,要注意以下:

1、定时器并不是线程:定时器时间和普通鼠标、键盘事件一样,进入事件循环进行处理,因此,定时器的处理函数需要尽快完成,不然也会把界面卡死;

2、定时器不是精确的,因为它需要放在事件循环中处理,因此如果其他事件占用了较多的事件,会导致定时器不够精确

三、创建线程

在Qt里,线程相关的类:

QThread:线程

QMutex:互斥锁

QSemaphore:信号量

创建线程的方法:

1、派生一个线程类,继承自QThread,然后重写入口函数run()方法

启动:start()

回收:wait()

2、添加一些成员函数,用于查询任务的状态和进度

状态: int GetStatus(); 返回值: 1(已完成) 2(正在进行) 3(发生错误,已终止)

进度:int GetProgress();    返回值:  0 ~ 100

创建工作线程:

工作线程就是一个普通的线程,区别于“界面线程”

当一个事件处理可能需要较长的时间,就创建一个线程来完成它,以免线程卡死。

步骤:

1、创建,并启动一个工作线程

2、显示一个进度条或等待对话框

3、启动一个定时器,定时查询工作线程的进度和状态,在其完成之后,填满进度条,结束等待

小练习:

模拟传送一个文件,显示任务进度

代码:

github:

https://github.com/HonestFox/Qt/tree/master/12_8FileTransferStatu

时间: 2024-11-29 00:05:20

【Qt学习笔记】8.Qt中的多线程的相关文章

Qt学习笔记:Qt中使用Lua

今天想在Qt中使用Lua进行数据操作 结果发现在Qt中使用Lua的文章较少,虽然很简单,但是还是写出来提供入门,顺便记录一下 我使用的是Qt Creator 3.4.2,用的是mingw4.9.2的编译器 我在Lua官网下载lua版本是5.3.1 首先,在要Qt中进行编译Lua,拿到.a和dll这两个文件 在Qt Creator->文件->新建文件或项目->Library->C++库,接下来根据情况一路下一步完成创建 然后,右键自己的项目,选择添加现有文件,添加下载好的Lua文件中

Qt学习笔记-嵌入式qt程序支持显示中文

移植后得qt程序在开发板上运行时无法显示中文. 拷贝windows中的字体也不行. 从网上找到方法. 添加以下代码:需要头文件  #include <QTextCodec> QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); //支持Tr中文 QText

QT学习笔记_Hello QT!

纠结了一番还是觉得swing太..还是撸QT吧 不过QT貌似也不是盖的,光配置环境弄了老半天.. 这次先输出hello QT ! 不过运行后的框太小了 ,虽然可以自己放大,但初始化不知道可不可以调? 慢慢来.. 输出部分使用了HTML 修改字体及颜色,居然可以混合HTML 这是极好的 #include <QApplication> #include <QLabel> int main(int argc,char *argv[]) { QApplication app(argc,ar

【Qt学习笔记】13.拖放技术:Drag & Drop

1.接受拖放 Drag & Drop 是一个界面操作,用于在两个窗口间传递数据. Drag Source: 拖放源窗口 Drag Target: 拖放目标窗口 拖放操作: 1.在源窗口:选中目标,按下鼠标,移动,拖至目标窗口(Drag) 2.在目标窗口:取消鼠标,到指定位置,松开鼠标(Drop) (按下ESC取消操作) MIME: MIME(Multipurpose Internet Mail Extensions)被传递的数据以MIME格式传送,它是多组type-data数据:(type0,

QT学习笔记—1

1.模态和非模态的区别:非模态可以同时操作两个窗口,模态的只能在顶层窗口关闭之后才能使用其他窗口 //同时显示出widget和dialog窗口,非模态     QDialog *dialog = new QDialog(this);     dialog->show(); //同时显示出widget和dialog窗口,模态     QDialog *dialog = new QDialog(this);     dialog->setModal(true);     dialog->sh

Qt学习笔记-Widget布局管理

Qt学习笔记4-Widget布局管理 以<C++ GUI Programming with Qt 4, Second Edition>为参考 实例:查找对话框 包含三个文件,finddialog.h,finddialog.cpp及main.cpp. //finddialog.h代码 #ifndef FINDDIALOG_H#define FINDDIALOG_H #include <QDialog> class QCheckBox;class QLabel;class QLineE

【Qt学习笔记】2.窗体Widget && 屏幕坐标 && 布局

一.窗体 在Qt中,把窗体(口)叫做Widget. Widget可以是主窗体(口),也可以是依附在主窗体(口)上的各种控件,作为子窗体,这两种窗口,分别称作顶级窗口(top-level widget)和子窗口(sub widget). 顶级窗口:一个标准的窗口,带边框.标题栏.若干按钮.(独立) 子窗口:在窗口里面的窗口,例如:按钮.文本框等控件.(不独立,随着父窗口移动) 注意: 1.每个子窗口都有一个父窗口 2.子窗口里面可能包含了若干子窗口,是一层一层的关系. 3.顶级窗口也有父窗口:就是

qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果

应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏,主机是mini2440,分辨率是800*480,程序写比較粗糙,但对刚開始学习的人还是有一点启示,大家一起进步. qt中提供了QGphicsView,QGraphicsScene,QGraphicsItem,QGraphicsPixmapItem是QGraphicsItem的子类 分辨创建它们的实

QT学习笔记(1)

采用QT创建一个GUI的应用程序时,都必须包含一个QApplication的对象,而对于非GUI的QT程序,可以使用不依赖QtGui库的QApplication QT的主要类: QLable                   标签类 QPushButton          按钮类 QVBoxLayout          竖布局管理器类 QHBoxLayout          横布局管理器类 QWidget                 窗口部件类 QGridLayout        

MVC4 学习笔记 之 URL中存在编译的空格 20%20%

/Config/Edit/QQCC%20%20%20%20%20%20%20 原因是: 通过EF直接添加了空格? NO 是因为你的数据库字段设计问题,因为你当然设计如>:sID nchar(10) 那你一定想输入10个字符,但实际你只输入了必个,所以后面数据自动帮你补空了. 从EF数据库取出数据,在绑定的时候为安全,编码了,所以显示%20,代表一个空格. MVC4 学习笔记 之 URL中存在编译的空格 20%20%,布布扣,bubuko.com