ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:21.53KB ,
资源ID:5669238      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5669238.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(黑马程序员C语言教程 Qt多线程程序设计.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

黑马程序员C语言教程 Qt多线程程序设计.docx

1、黑马程序员C语言教程 Qt多线程程序设计传智播客C/C+培训专家: Qt多线程程序设计分类:?C/C+ QT通过三种形式提供了对线程的支持。它们分别是,一、平台无关的线程类,二、线程安全的事件投递,三、跨线程的信号-槽连接。这使得开发轻巧的多线程Qt程序更为容易,并能充分利用多处理器机器的优势。多线程编程也是一个有用的模式,它用于解决执行较长时间的操作而不至于用户界面失去响应。在Qt的早期版本中,在构建库时有不选择线程支持的选项,从4.0开始,线程总是有效的。线程类Qt包含下面一些线程相关的类: QThread提供了开始一个新线程的方法 QThreadStorage提供逐线程数据存储 QMut

2、ex提供相互排斥的锁,或互斥量 QMutexLocker是一个便利类,它可以自动对QMutex加锁与解锁 QReadWriterLock提供了一个可以同时读操作的锁 QReadLocker与QWriteLocker是便利类,它自动对QReadWriteLock加锁与解锁 QSemaphore提供了一个整型信号量,是互斥量的泛化 QWaitCondition提供了一种方法,使得线程可以在被另外线程唤醒之前一直休眠。创建一个线程为创建一个线程,子类化QThread并且重写它的run()函数,例如:class MyThread : public QThread Q_OBJECTprotected:

3、void run();void MyThread:run() . 创建这个线程对象的实例,调用QThread:start()。于是,在run()里出现的代码将会在另外线程中被执行。注意:QCoreApplication:exec()必须总是在主线程(执行main()的那个线程)中被调用,不能从一个QThread中调用。在GUI程序中,主线程也被称为GUI线程,因为它是唯一一个允许执行GUI相关操作的线程。另外,你必须在创建一个QThread之前创建QApplication(or QCoreApplication)对象。线程同步 QMutex,QReadWriteLock,QSemaphore,

4、QWaitCondition提供了线程同步的手段。使用线程的主要想法是希望它们可以尽可能并发执行,而一些关键点上线程之间需要停止或等待。例如,假如两个线程试图同时访问同一个全局变量,结果可能不如所愿。 QMutex提供相互排斥的锁,或互斥量。在一个时刻至多一个线程拥有mutex,假如一个线程试图访问已经被锁定的mutex,那么它将休眠,直到拥有mutex的线程对此mutex解锁。Mutexes常用来保护共享数据访问。 QReadWriterLock与QMutex相似,除了它对 read,write访问进行区别对待。它使得多个读者可以共时访问数据。使用QReadWriteLock而不是QMute

5、x,可以使得多线程程序更具有并发性。QReadWriteLock lock;void ReaderThread:run() / . lock.lockForRead(); read_file(); lock.unlock(); /.void WriterThread:run() / . lock.lockForWrite(); write_file(); lock.unlock(); / . QSemaphore是QMutex的一般化,它可以保护一定数量的相同资源,与此相对,一个mutex只保护一个资源。下面例子中,使用QSemaphore来控制对环状缓冲的访问,此缓冲区被生产者线程和消费者线

6、程共享。生产者不断向缓冲写入数据直到缓冲末端,再从头开始。消费者从缓冲不断读取数据。信号量比互斥量有更好的并发性,假如我们用互斥量来控制对缓冲的访问,那么生产者,消费者不能同时访问缓冲。然而,我们知道在同一时刻,不同线程访问缓冲的不同部分并没有什么危害。const int DataSize = 100000;const int BufferSize = 8192;char bufferBufferSize;QSemaphore freeBytes(BufferSize);QSemaphore usedBytes;class Producer : public QThreadpublic: vo

7、id run();void Producer:run() qsrand(QTime(0,0,0).secsTo(QTime:currentTime(); for (int i = 0; i DataSize; +i) freeBytes.acquire(); bufferi % BufferSize = ACGT(int)qrand() % 4; usedBytes.release(); class Consumer : public QThreadpublic: void run();void Consumer:run() for (int i = 0; i DataSize; +i) us

8、edBytes.acquire(); fprintf(stderr, %c, bufferi % BufferSize); freeBytes.release(); fprintf(stderr, n);int main(int argc, char *argv) QCoreApplication app(argc, argv); Producer producer; Consumer consumer; producer.start(); consumer.start(); producer.wait(); consumer.wait(); return 0; QWaitCondition允

9、许线程在某些情况发生时唤醒另外的线程。一个或多个线程可以阻塞等待一QWaitCondition ,用wakeOne()或wakeAll()设置一个条件。wakeOne()随机唤醒一个,wakeAll()唤醒所有。下面的例子中,生产者首先必须检查缓冲是否已满 (numUsedBytes=BufferSize),如果是,线程停下来等待bufferNotFull条件。如果不是,在缓冲中生产数据,增加numUsedBytes,激活条件 bufferNotEmpty。使用mutex来保护对numUsedBytes的访问。另外,QWaitCondition:wait()接收一个mutex作为参数,这个mu

10、tex应该被调用线程初始化为锁定状态。在线程进入休眠状态之前,mutex会被解锁。而当线程被唤醒时,mutex会处于锁定状态,而且,从锁定状态到等待状态的转换是原子操作,这阻止了竞争条件的产生。当程序开始运行时,只有生产者可以工作。消费者被阻塞等待bufferNotEmpty条件,一旦生产者在缓冲中放入一个字节,bufferNotEmpty条件被激发,消费者线程于是被唤醒。const int DataSize = 100000;const int BufferSize = 8192;char bufferBufferSize;QWaitCondition bufferNotEmpty;QWai

11、tCondition bufferNotFull;QMutex mutex;int numUsedBytes = 0;class Producer : public QThreadpublic: void run();void Producer:run() qsrand(QTime(0,0,0).secsTo(QTime:currentTime(); for (int i = 0; i DataSize; +i) mutex.lock(); if (numUsedBytes = BufferSize) bufferNotFull.wait(&mutex); mutex.unlock(); bu

12、fferi % BufferSize = ACGT(int)qrand() % 4; mutex.lock(); +numUsedBytes; bufferNotEmpty.wakeAll(); mutex.unlock(); class Consumer : public QThreadpublic: void run();void Consumer:run() for (int i = 0; i style = style; / set the style membervoid QPen:detach() if (d-ref != 1) . / perform a deep copy 一般认为,隐含共享与多线程不太和谐,因为有引用计数的存在。对引用计数进行保护的方法之一是使用mutex,但它很慢,Qt早期版本没有提供一个满意的解决方案。从4.0开始,隐含共享类可以安全地跨线程拷贝,如同别的值类型一样。它们是完全可重入的。隐含共享真的是implicit。它使用汇编语言实现了原子性引用计数操作,这比用mutex快多了。 假如你在多个线程中同进访问相同对象,你也需要用mutex来串行化访问顺序,就如同其他可重入对象那样。总的来讲,隐含共享真的给”隐含“掉了,在多线程程序中,你可以把它们看成是一般的,非共享的,可重入的类型,这种做法是安全的。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1