Qt多线程设计初探01

多线程编程是每个程序员都应掌握的技能,Qt在这里通过三种形式提供了对线程的支持。它们分别是:

一、平台无关的线程类。

二、线程安全的事件投递。

三、跨线程的信号-槽连接。

这使得开发多线程Qt程序更为容易,并能充分利用多处理器机器的优势。多线程编程也是一个有用的模式,它用于解决执行较长时间的操作而不至于用户界面失去响应 。

 

Qt常用的线程类:

QThread 提供了开始一个新线程的方法
QThreadStorage 提供逐线程数据存储
QMutex 提供相互排斥的锁,或互斥
QMutexLocker 是一个便利类,它可以自动对QMutex加锁与解锁
QReadWriterLock 提供了一个可以同时读操作的锁
QReadLocker与QWriteLocker 是便利类,它自动对QReadWriteLock锁与解锁
QSemaphore 提供了一个整型信号量,是互斥量的泛化
QWaitCondition 提供了一种方法,使得线程可以在被另外线程唤醒之前一直休眠。

一:创建线程类,通过子类化QThread并实现其run方法:

h文件

#ifndef TESTQTHREAD_H
#define TESTQTHREAD_H

#include <QThread>

class QObject;

class TestQThread : public QThread
{
public:
    explicit TestQThread(QObject* parent = 0);

    void runMethod();

protected:
    virtual void run();
};

#endif // TESTQTHREAD_H

cpp文件

#include <iostream>
#include <QObject>
#include "testqthread.h"

TestQThread::TestQThread(QObject *parent) :
    QThread(parent)
{

}

void TestQThread::runMethod()
{
    for (int i(0); 100 != i; ++i) {
        std::cerr<< qPrintable('B');
    }
}

void TestQThread::run()
{
    for (int i(0); 100 != i; ++i) {
        std::cerr<< qPrintable('A');
    }
}

main文件

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    TestQThread t;
    t.start();
    t.runMethod();

    t.wait();

    return a.exec();
}

可以看到通过start方法启动一个子线程打印‘A',runMethod方法在主线程中打印‘B’。多次运行可以看到A、B字符随机打出。

B
BBBBABBBBBBBA
ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAAAAAAAAAAA

二:QMutex的使用

QMutex是作为互斥量,确保在其影响范围内的“数据”或代码在同一时刻只会被一个线程进行处理(确保包含其的类对象的特殊代码在同一时段只会被一个线程处理)。QMutex应被声明为类字段,确保可以在不同的方法中调用,确保“数据”被线程安全调用。

QMutex mutex;
...
mutex.lock();
...             //(数据)
mutex.unlock();

三:QMutexLocker

因为QMutex的使用需要lock和unlock方法配合使用,在此可用QMutexLocker简化处理。在此处QMutexLocker应被声明为方法内的局部字段,通过类字段QMutex来确保“数据”被线程安全调用。

QMutex mutex;
...
{
    QMutexLocker locker(&mutex); //等同于执行mutex.lock();
    ...
    ...
    (括号内最后一条执行语句之后)    //等同于执行mutex.unlock();
} 

四:QSemaphore

是互斥量的泛化,可以用来保护处理多个数据量。

转载于:https://my.oschina.net/weiweiqiao/blog/675910

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值