Qt 多 线 程一
何谓线程?
线程与并行处理任务息息相关,就像进程一样。那么,线程与进程有什么区别呢?当你在电子表格上进行数据结算的时候,在相同的桌面上可能有一个播放器正在播放你最喜欢的歌曲。这是一个两个进程并行工作的例子:一个进程运行电子表格程序;另一个进程运行一个媒体播放器。这种情况最适合用多任务这个词来描述。进一步观察媒体播放器,你会发现在这个进程内,又存在并行的工作。当媒体播放器向音频驱动发送音乐数据的时候,用户界面上与之相关的信息不断地进行更新。这就是单个进程内的并行线程。
Qt线程类
Qt 包含下面一些线程相关的类:
QThread 提供了开始一个新线程的方法
QThreadStorage 提供逐线程数据存储
QMutex 提供相互排斥的锁,或互斥量
QMutexLocker 是一个便利类,它可以自动对QMutex加锁与解锁
QReadWriterLock 提供了一个可以同时读操作的锁
QReadLocker与QWriteLocker 是便利类,它自动对QReadWriteLock加锁与解锁
QSemaphore 提供了一个整型信号量,是互斥量的泛化
QWaitCondition 提供了一种方法,使得线程可以在被另外线程唤醒之前一直休眠。
Qt创建线程
线程类
最重要的类是QThread,也就是说要开始一个新的线程,就是开始执行你重新实现的QThread::run()。这和Java的线程类很相似
qt app 提供多线程步骤:子类化QThread 和重新实现QThread 的纯虚函数run().,通过调用start来call run机制
Qt线程中有一个公共的抽象类QThread ,所有的线程都是从这个QThread抽象类中派生的,要实现QThread中的纯虚函数run(),run()函数是通过start()函数来实现调用的。
#include <QApplication>
#include <QThread>
#include <QDebug>
class mythread:public QThread
{
protected:
virtual void run();//deprive from parent class
};
void mythread::run()
{
for(char i=0;i<3;i++)
{
sleep(1);//sleep 1s
qDebug()<<("haha--worker thread run !!!ID is")<<mythread().currentThreadId();//
}
}
int main(int argc,char **argv)
{
QApplication a(argc, argv);
mythread mythreadA;
mythreadA.start();//to aumatic call run() function
/* qDebug()<<("haha--GUI thread run !!!");//
qDebug()<<("ID is");
qDebug()<<a.thread()->currentThreadId();
*/
// qDebug()<<("haha--GUI thread run !!!,ID is ")<<a.thread()->currentThreadId();
//wait thread exit
mythreadA.wait();//let child thread first run ,and exit
qDebug()<<("haha--GUI thread run !!!,ID is ")<<a.thread()->currentThreadId();
return 0;
}
运行结果:
MyThread]# ./MyThread
haha--worker thread run !!!ID is 3077102480
haha--worker thread run !!!ID is 3077102480
haha--worker thread run !!!ID is 3077102480
haha--GUI thread run !!!,ID is 3085875792