lesson15-QT多线程_PHP教程
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、多线程
<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 /></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>
<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 /></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 /></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、信号量
<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 /></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>
<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 /></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>
<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 /></li><li>#include <QSemaphore><br /></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 /></li><li>{<br /></li><li>freeByte.acquire();<br /></li><li>qDebug()<<"produer:"<<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 /></li><li>{<br /></li><li>useByte.acquire();<br /></li><li>qDebug()<<"consumer:"<<i;<br /></li><li>freeByte.release();<br /></li><li>sleep(2);<br /></li><li>}<br /></li><li>} </li></ol>
3、条件变量
<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 /></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>
<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 /></li><li>#include <QMutex><br /></li><li>#include <QWaitCondition><br /></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 /></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 /></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>

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제









최근 아이스 유니버스는 삼성의 차기 플래그십 스마트폰으로 널리 알려진 갤럭시 S25 울트라에 대한 세부 정보를 꾸준히 공개해 왔습니다. 무엇보다도 유출자는 삼성이 카메라 업그레이드를 하나만 가져올 계획이라고 주장했습니다.

OnLeaks는 이제 Android Headlines와 제휴하여 X(이전 Twitter) 팔로어로부터 4,000달러 이상의 수익을 창출하려는 시도가 실패한 지 며칠 후 Galaxy S25 Ultra에 대한 첫 번째 모습을 제공합니다. 맥락에 따라 h 아래에 포함된 렌더링 이미지

TCL은 두 가지 새로운 스마트폰을 발표하는 것과 함께 NXTPAPER 14라는 새로운 Android 태블릿도 발표했는데, TCL의 거대한 화면 크기는 판매 포인트 중 하나입니다. NXTPAPER 14는 TCL의 시그니처 브랜드인 무광택 LCD 패널 버전 3.0을 갖추고 있습니다.

최근 아이스 유니버스는 삼성의 차기 플래그십 스마트폰으로 널리 알려진 갤럭시 S25 울트라에 대한 세부 정보를 꾸준히 공개해 왔습니다. 무엇보다도 유출자는 삼성이 카메라 업그레이드를 하나만 가져올 계획이라고 주장했습니다.

Vivo Y300 Pro는 방금 완전히 공개되었으며 대용량 배터리를 갖춘 가장 얇은 중급 Android 휴대폰 중 하나입니다. 정확히 말하면 스마트폰의 두께는 7.69mm에 불과하지만 배터리 용량은 6,500mAh입니다. 최근 출시된 것과 동일한 용량이다.

삼성전자는 팬에디션(FE) 스마트폰 시리즈를 언제 업데이트할지 아직 힌트를 주지 않았다. 현재 상태로 Galaxy S23 FE는 2023년 10월 초에 출시된 회사의 최신 버전으로 남아 있습니다.

Redmi Note 14 Pro Plus는 이제 작년 Redmi Note 13 Pro Plus(Amazon에서 현재 $375)의 직접적인 후속 제품으로 공식화되었습니다. 예상대로 Redmi Note 14 Pro Plus는 Redmi Note 14 및 Redmi Note 14 Pro와 함께 Redmi Note 14 시리즈를 주도합니다. 리

모토로라는 올해 셀 수 없이 많은 기기를 출시했지만 그 중 폴더블 기기는 2개뿐이었습니다. 맥락에 따라 전 세계 대부분이 Razr 50 및 Razr 50 Ultra로 쌍을 받았지만 Motorola는 북미에서 Razr 2024 및 Razr 2로 제공합니다.
