赞
踩
每个程序启动后拥有的第一个线程称为主线程,即GUI线程。QT中所有的组件类和几个相关的类只能工作在GUI线程,不能工作在次线程,次线程即工作线程,主要负责处理GUI线程卸下的工作。
每个线程都有自己的栈,因此每个线程都要自己的调用历史和本地变量。线程共享相同的地址空间。
Qt通过三种形式提供了对线程的支持,分别是平台无关的线程类、线程安全的事件投递、跨线程的信号-槽连接。
Qt中线程类包含如下:
1、QThread线程基础
QThread是Qt线程中有一个公共的抽象类,所有的线程类都是从QThread抽象类中派生的,需要实现QThread中的虚函数run(),通过start()函数来调用run函数。
void run()函数是线程体函数,用于定义线程的功能。
void start()函数是启动函数,用于将线程入口地址设置为run函数。
void terminate()函数用于强制结束线程,不保证数据完整性和资源释放。
QCoreApplication::exec()总是在主线程(执行main()的线程)中被调用,不能从一个QThread中调用。在GUI程序中,主线程也称为GUI线程,是唯一允许执行GUI相关操作的线程。另外,必须在创建一个QThread前创建QApplication(or QCoreApplication)对象。
当线程启动和结束时,QThread会发送信号started()和finished(),可以使用isFinished()和isRunning()来查询线程的状态。
从Qt4.8起,可以释放运行刚刚结束的线程对象,通过连接finished()信号到QObject::deleteLater()槽。
使用wait()来阻塞调用的线程,直到其它线程执行完毕(或者直到指定的时间过去)。
静态函数currentThreadId()和currentThread()返回标识当前正在执行的线程。前者返回线程的ID,后者返回一个线程指针。
要设置线程的名称,可以在启动线程之前调用setObjectName()。如果不调用setObjectName(),线程的名称将是线程对象的运行时类型(QThread子类的类名)。
1、建立工程
2、设计ui及控件、控件属性
3、添加工作线程
建立头文件workthread.h
在右侧添加如下代码
- #include <QThread>
-
- class WorkThread : public QThread
- {
- Q_OBJECT
-
- public:
- WorkThread();
-
- protected:
- void run();
- };
4、添加workthread.cpp文件
在右侧添加如下代码:
重写run()函数
- #include "workthread.h"
- #include <QtDebug>
-
- WorkThread::WorkThread()
- {
-
- }
-
- void WorkThread::run()
- {
- while (true)
- {
- for ( int n = 0; n < 10; n++ )
- {
- qDebug()<<n<<n<<n<<n<<n<<n<<n<<n;
- }
- }
- }
5、在threaddlg.h中添加如下内容:
- #include "workthread.h"
- #define MAXSIZE 1
-
-
-
- public slots:
- void slotStart();
- void slotStop();
- void slotExit();
-
- private:
-
- WorkThread *workThread[MAXSIZE];
6、在threaddlg.cpp中完成槽函数功能
- connect(ui->startBtn, SIGNAL(clicked(bool)),this, SLOT(slotStart()));
- connect(ui->stopBtn, SIGNAL(clicked(bool)),this, SLOT(slotStop()));
- connect(ui->exitBtn, SIGNAL(clicked(bool)),this, SLOT(slotExit()));
- void threadDlg::slotStart()
- {
- for ( int i = 0; i < MAXSIZE; i++ )
- {
- workThread[i] = new WorkThread();
- }
-
- for ( int i = 0; i < MAXSIZE; i++ )
- {
- workThread[i]->start();
- }
-
- ui->startBtn->setEnabled(false);
- ui->stopBtn->setEnabled(true);
- }
- void threadDlg::slotStop()
- {
- for ( int i = 0; i < MAXSIZE; i++ )
- {
- workThread[i]->terminate();
- workThread[i]->wait();
- }
-
- ui->startBtn->setEnabled(true);
- ui->stopBtn->setEnabled(false);
- }
- void threadDlg::slotExit()
- {
- this->close();
- }
运行效果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。