QT:Qt多线程创建
来源:互联网 发布:sqlserver下载 64位 编辑:程序博客网 时间:2024/05/15 23:14
QT多线程创建
#include <QThread > 跨平台的管理线程的方法
// QThread类提供了一种独立于平台的方式来管理线程。
'QT创建线程的方法 1 :'
class Worker : public QObject { void doWork(const QString ¶meter) { /* 有阻塞或者耗时的操作,需要放到独立的线程中去执行 */ }class Controller : public QObject { QThread workerThread; // 线程对象public: Controller( ) { // new 出一个类自身的对象 Worker *worker = new Worker; // 将worker对象移动到线程中 worker->moveToThread(&workerThread); // emit信号operate,执行doWork函数 - 信号与槽的连接 connect(this, &Controller::operate, worker, &Worker::doWork); // 开始线程,doWork在独立的线程中被执行 workerThread.start( ); }signals: void operate(const QString &);};
'QT创建线程的方法 2 : - 重写run ( ) 函数用的较多 '
class WorkerThread : public QThread { void run ( ) { // 线程处理函数入口 /* 有阻塞或者耗时的操作,需要放到独立的线程中去执行 */ }};void MyObject::startWorkInAThread ( ) { // new 出一个类自身的对象 WorkerThread *workerThread = new WorkerThread( this ); // 开始线程,run ( )函数自动被调用,并且在独立的线程中被执行 workerThread->start ();}
<tips>
C++玩的转以后,JAVA语言只需要一周即可上手编程。
QThread - QT线程类
bool QThread::wait ( unsigned long time = ULONG_MAX ); // 成员函数
功能:线程等待,可指定等待时间
参数:'time' 等待时间,单位 ms (毫秒)
返回值:
true - 线程完成,或者线程并没有开始执行
false - 线程等待时间结束
【注】run ( )函数返回时,线程完成执行
QThread slots function :
void QThread::quit() [slot];
功能:线程退出
void QThread::start(Priority priority = InheritPriority) [slot];
功能:线程开始
void QThread::terminate() [slot];
功能:线程终止,并不一定马上终止;线程终止时,所有等待的线程将被唤醒。
【注1】Use QThread::wait( ) after terminate(), to be sure. 如果在此函数后调用wait函数,则终止一定会执行。
【注2】在new和delete中间使用terminate ( )终止,导致'内存泄露 ';
在lock和unlock中间使用terminate ( )终止,导致'死锁问题 '。
(代码量较多时需要注意这些内存和并发的问题)
QThread static Public Members :
Qt::HANDLE currentThreadId( ) [static]; // QT::HANDLE void * 类型
功能:返回线程句柄(可理解为线程ID)
《案例》多线程打印数据
工程名:Thread
类名:ThreadDialog
/** 代码演示 - 【重点】需要掌握线程的创建 **/
// workThread.h #ifndef WORKTHREAD_H#define WORKTHREAD_H#include <QThread>#include <QDebug>class workThread : public QThread {public: workThread(); ~workThread();private: // 重写run函数 void run (void);};#endif // WORKTHREAD_H
// ThreadDialog.h #ifndef THREADDIALOG_H#define THREADDIALOG_H#include <QDialog>#include "workThread.h"namespace Ui {class ThreadDialog;}class ThreadDialog : public QDialog{ Q_OBJECTpublic: explicit ThreadDialog(QWidget *parent = 0); ~ThreadDialog();private slots: void on_startButton_clicked(); void on_stopButton_clicked(); void on_quitButton_clicked();private: Ui::ThreadDialog *ui;private: // 两个子线程对象 workThread* threadA; workThread* threadB;};#endif // THREADDIALOG_H
// workThread.cpp #include "workThread.h"workThread::workThread() { }workThread::~workThread() { }void workThread::run (void) { unsigned long threadId = (unsigned long)currentThread (); while (1) { for (int i = 1; i <= 20; i++) { qDebug ("%lu : %d", threadId, i); msleep (500); } }}
// ThreadDialog.cpp #include "ThreadDialog.h"#include "ui_ThreadDialog.h"ThreadDialog::ThreadDialog(QWidget *parent) : QDialog(parent), ui(new Ui::ThreadDialog) { ui->setupUi(this); threadA = new workThread; threadB = new workThread;}ThreadDialog::~ThreadDialog() { delete ui;}void ThreadDialog::on_startButton_clicked() { threadA->start (); // 开始线程A,run() 函数在子线程被执行 threadB->start (); // 开始线程A,run() 函数在子线程被执行 ui->stopButton->setEnabled (true); ui->startButton->setEnabled (false);}void ThreadDialog::on_stopButton_clicked() { threadA->terminate (); // 终止线程,后面一定要调用wait() threadA->wait (); threadB->terminate (); threadB->wait (); ui->stopButton->setEnabled (false); ui->startButton->setEnabled (true);}void ThreadDialog::on_quitButton_clicked() { close ();}
- QT:Qt多线程创建
- Qt多线程学习:创建多线程
- Qt多线程学习:创建多线程
- Qt多线程学习:创建多线程
- Qt多线程学习:创建多线程
- Qt多线程学习:创建多线程
- Qt多线程学习:创建多线程
- Qt创建多线程读取摄像头
- Qt: Qt多线程设计
- QT:Qt多线程同步
- qt创建多线程的几种方法
- Qt多线程创建的两种方法
- Qt多线程
- Qt多线程
- Qt多线程
- qt 多线程
- Qt多线程
- QT多线程
- UIBase
- greenDAO 3.2 初探
- LoginPanel
- 最大K乘积
- mac mysql 重置root密码
- QT:Qt多线程创建
- 尺取法
- Lucene学习-CRUD
- QT:Qt多线程同步
- Linux时间参数atime、ctime、mtime
- windows搭建spark运行环境(windows scala,hadoop,spark安装,idea使用配置等)
- 部署 instance 到 OVS vlan100
- 1031. 查验身份证(15)-PAT乙级
- QT:Qt 网络编程基础