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 ();}

0 0
原创粉丝点击