多线程编程是每个程序员都应掌握的技能,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
是互斥量的泛化,可以用来保护处理多个数据量。

543

被折叠的 条评论
为什么被折叠?



