当前位置:Gxlcms > PHP教程 > lesson15-QT多线程_PHP教程

lesson15-QT多线程_PHP教程

时间:2021-07-01 10:21:17 帮助过:6人阅读

lesson15-QT多线程


一、什么是线程
1、线程
进程:一个正在执行的程序,它是资源分配的最小单位
线程:程序执行的最小单位

进程出现了很多弊端,一是由于进程是资源拥有者,创建、撤消与切换存在较大的时空开销,因此需要引入轻型进程;二是由于对称多处理机(SMP)出现,可以满足多个运行单位,而多个进程并行开销过大。

2、线程的术语
并发是指在同一时刻,只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上具有多个进程同时执行的效果。
看起来同时发生

并行是指在同一时刻,有多条指令在多个处理器上同时执行。
真正的同时发生

同步:彼此有依赖关系的调用不应该“同时发生”,而同步就是要阻止那些“同时发生”的事情
异步的概念和同步相对,任何两个彼此独立的操作是异步的,它表明事情独立的发生

3、线程的优势
1)、在多处理器中开发程序的并行性
2)、在等待慢速IO操作时,程序可以执行其他操作,提高并发性
3)、模块化的编程,能更清晰的表达程序中独立事件的关系,结构清晰
4)、占用较少的系统资源

多线程不一定要多处理器
GUI程序中经常会使用多线程技术,一个线程用来响应界面,而其他线程就可以在后台处理冗长的操作
Qt的元对象系统支持不同线程中的对象使用信号和槽机制通信




二、QT多线程
Qt中使用多线程是非常简单的,只要子类话QThread就可以了,在QThread中有一个protected类型的run函数,重写run函数就可以实现多线程。
1、QT线程
Qt中使用多线程是非常简单的,只要子类化QThread,然后重写run函数就可以实现多线程

class MyThread:public Thread
{
public:
MyThread();
protected:
void run();
private:
volatile boolean stopped;
}

run函数是通过线程的start方法启动的,线程还有isRunning方法来判断是否在运行,terminate方法结束线程


2、线程同步之信号量
信号量使线程不需要忙碌的等待,是对mutex的一种扩展。使用信号量可以保证两个关键代码不会并发。在进入一段关键代码时,线程必须获取信号量,退出时必须释放。信号量可以同时由多个线程访问。

Qt的信号量QSemaphore类:
acquire()用来获取资源,free()用来释放资源

生产者和消费者的例子,生产者生产的时候需要确保有足够的空间,消费者消费的时候要确保空间里有资源
QSemaphore freeByte(100) 生产有有100个空间
QSemaphore useByte(0)消费者没有资源
producer
{
freeByte.acquire()
byte = n
useByte.release()
}
consumer
{
useByte.acquire()
printf byte
freeByte.release()
}


3、线程同步之条件变量
QWaitCondition允许线程在一定条件下唤醒其他的线程,这样也可以是线程不必忙碌的等待,条件变量要配合互斥量来使用

QMutex mutex; QWaitCondition condition;
condition.wait(&mutex)
condition.wakeAll()
wait函数将互斥量解锁,并在此等待,此函数返回之前会将互斥量重新枷锁。
wakeAll函数会将所有等待该互斥量的线程唤醒


4、线程优先级
实际任务可能会让某个线程先运行,那么就需要设置线程优先级。
setPriority函数可以设置线程的优先级,或者在线程启动的时候在start函数传入线程的优先级


三、实例
1、多线程
  1. <ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>#ifndef MYTHREAD_H<br> </li><li>#define MYTHREAD_H<br></li><li><br></li><li>#include <qthread><br></qthread></li><li><br></li><li>class MyThread : public QThread<br></li><li>{<br></li><li>Q_OBJECT<br></li><li>public:<br></li><li>MyThread();<br></li><li>void stop();<br></li><li>volatile bool stopped;<br></li><li>protected:<br></li><li>void run();<br></li><li>};<br></li><li>#endif</li></ol>
  1. <ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>#include "myThread.h"<br> </li><li>#include <qtdebug><br></qtdebug></li><li><br></li><li>MyThread::MyThread()<br></li><li>{<br></li><li>stopped = false;<br></li><li>}<br></li><li><br></li><li>void MyThread::run()<br></li><li>{<br></li><li>int i=0;<br></li><li>while(!stopped)<br></li><li>{<br></li><li>qDebug()<<"thread id:"<qthread::currentthreadid()<<":"<<i;<br></qthread::currentthreadid()<<":"<<i;<br></li><li>i++;<br></li><li>sleep(2);<br></li><li>}<br></li><li>stopped = false;<br></li><li>}<br></li><li><br></li><li>void MyThread::stop()<br></li><li>{<br></li><li>stopped = true;<br></li><li>} </li></ol>

2、信号量

  1. <ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>#ifndef PRODUCER_H<br> </li><li>#define PRODUCER_H<br></li><li><br></li><li>#include <qthread><br></qthread></li><li><br></li><li>class Producer : public QThread<br></li><li>{<br></li><li>Q_OBJECT<br></li><li>public:<br></li><li>Producer();<br></li><li>protected:<br></li><li>void run();<br></li><li>};<br></li><li><br></li><li>#endif</li></ol>

  1. <ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>#ifndef CONSUMER_H<br> </li><li>#define CONSUMER_H<br></li><li><br></li><li>#include <qthread><br></qthread></li><li><br></li><li>class Consumer : public QThread<br></li><li>{<br></li><li>Q_OBJECT<br></li><li>public:<br></li><li>Consumer();<br></li><li>protected:<br></li><li>void run();<br></li><li>};<br></li><li><br></li><li>#endif</li></ol>

  1. <ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>#include "producer.h"<br> </li><li>#include "consumer.h"<br></li><li>#include <qdebug><br></qdebug></li><li>#include <qsemaphore><br></qsemaphore></li><li><br></li><li>#define SIZE 50<br></li><li>QSemaphore freeByte(SIZE);<br></li><li>QSemaphore useByte(0);<br></li><li><br></li><li>Producer::Producer()<br></li><li>{<br></li><li><br></li><li>}<br></li><li>void Producer::run()<br></li><li>{<br></li><li>for(int i=0; i<size; i++)<br=""></size;></li><li>{<br></li><li>freeByte.acquire();<br></li><li>qDebug()<<"produer:"<<i;<br></i;<br></li><li>useByte.release();<br></li><li>sleep(1);<br></li><li>}<br></li><li>}<br></li><li>Consumer::Consumer()<br></li><li>{<br></li><li><br></li><li>}<br></li><li>void Consumer::run()<br></li><li>{<br></li><li>for(int i=0; i<size; i++)<br=""></size;></li><li>{<br></li><li>useByte.acquire();<br></li><li>qDebug()<<"consumer:"<<i;<br></i;<br></li><li>freeByte.release();<br></li><li>sleep(2);<br></li><li>}<br></li><li>} </li></ol>


3、条件变量

  1. <ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>#ifndef THREAD_H<br> </li><li>#define THREAD_H<br></li><li><br></li><li>#include<qthread><br></qthread></li><li><br></li><li>class Producer : public QThread<br></li><li>{<br></li><li>Q_OBJECT<br></li><li>public:<br></li><li>Producer();<br></li><li>protected:<br></li><li>void run();<br></li><li>};<br></li><li><br></li><li>class Consumer : public QThread<br></li><li>{<br></li><li>Q_OBJECT<br></li><li>public:<br></li><li>Consumer();<br></li><li>protected:<br></li><li>void run();<br></li><li>};<br></li><li><br></li><li>#endif</li></ol>

  1. <ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>#include "thread.h"<br> </li><li>#include <qdebug><br></qdebug></li><li>#include <qmutex><br></qmutex></li><li>#include <qwaitcondition><br></qwaitcondition></li><li><br></li><li>QMutex mutex;<br></li><li>QWaitCondition empty, full;<br></li><li>int num=0;<br></li><li>int buffer[50];<br></li><li>int useByte=0;<br></li><li><br></li><li><br></li><li>Producer::Producer()<br></li><li>{<br></li><li><br></li><li>}<br></li><li>void Producer::run()<br></li><li>{<br></li><li>for(int i=0; i<50; i++)<br></li><li>{<br></li><li>mutex.lock();<br></li><li>if(useByte==50)<br></li><li>empty.wait(&mutex);<br></li><li>num++;<br></li><li>buffer[i] = num;<br></li><li>qDebug()<<"producer:"<<num;<br></num;<br></li><li>useByte++;<br></li><li>full.wakeAll();<br></li><li>mutex.unlock();<br></li><li>sleep(1);<br></li><li>}<br></li><li>}<br></li><li>Consumer::Consumer()<br></li><li>{<br></li><li><br></li><li>}<br></li><li>void Consumer::run()<br></li><li>{<br></li><li>for(int i=0; i<50; i++)<br></li><li>{<br></li><li>mutex.lock();<br></li><li>if(useByte==0)<br></li><li>full.wait(&mutex);<br></li><li>qDebug()<<"consumer"<<buffer[i];<br></buffer[i];<br></li><li>useByte--;<br></li><li>empty.wakeAll();<br></li><li>mutex.unlock();<br></li><li>sleep(2);<br></li><li>}<br></li><li>} </li></ol>



www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1103190.htmlTechArticlelesson15-QT多线程 一、什么是线程 1、线程 进程:一个正在执行的程序,它是资源分配的最小单位 线程:程序执行的最小单位 进程出现了很...

人气教程排行