Qt线程同步2.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Qt线程同步2

Qt线程同步2 Qt线程同步 在Qt中使用线程,没有Mfc中那么繁琐,它提供了QThread线程类,提供了创建一个新线程的方法。线程通过重载QThread::run()函数来完成其操作的,这一点与Java中的线程类相似。 实现一个简单的继承自QThread的用户线程类,代码如下。 class Thread : public QThread { public: Thread(); void stop(); protected: virtual void run(); private: bool m_stop; }; Thread::Thread() { m_stop = false; } void Thread::stop() { m_stop = true; } void Thread::run() { while (!m_stop) { sleep(1); qDebug(vic.MINg!); } qDebug(end!); } 在以上的示例中可以看出,线程的编写并不难! 启动线程的时候可以,调用函数QThread::start(),开始Thread线程对象。 停止线程的时候可以,调用函数QThread::terminate(),但是terminate()函数并不会立刻终止线程,该线程何时终止取决于操作系统的调度策略。需要注意的是,terminate()函数过于毒辣,它可能在线程执行的任意一步终止执行,从而产生不可预知的后果(如修改某个重要数据时),另外,它也没有给线程任何清理现场的机会(如释放内存和锁等)。 因此,停止线程可以,如上代码所示,手写函数stop(),使其线程柔和的退出。 线程停止后,应调用QThread::wait()函数,它使的线程阻塞等待直到退出或超时。 貌似在Unix或Linux下编译多线程应用程序还必须在.pro文件中加入如下一行,它告诉qmake使用Qt库中的线程版本。Windows上,Qt库默认就是线程的。 CONFIG += thread 介绍完了线程的创建,接下来走入正题了,多线程应用程序的一个最普通的需求就是同步几个线程。Qt提供了以下几个类来完成这一点:QMutex、QMutexLocker、QSemphore、QWaitCondition。 当然可能还包含QReadWriteLocker、QReadLocker、QWriteLocker,但线程同步是应用很少,这里只做简单的讲解! ■:QMutex、QMutexLocker QMutex类提供了一个保护一段临界区代码的方法,他每次只允许一个线程访问这段临界区代码。QMutex::lock()函数用来锁住互斥量,如果互斥量处于解锁状态,当前线程就会立即抓住并锁定它;否则当前线程就会被阻塞,直到持有这个互斥量的线程对其解锁。线程调用lock()函数后就会持有这个互斥量直到调用unlock()操作为止。QMutex还提供了一个tryLock()函数,如果互斥量已被锁定,就立即返回。 现在使用QMutex保护上面的线程类的m_stop布尔变量,虽然没啥用,但这里的目的只是为了演示下QMutex的用法~~ //thread.h头文件,添加互斥量对象 private: ... QMutex mutex; }; void Thread::run() { forever { mutex.lock(); if (m_stop) { m_stop = false; mutex.unlock(); break; } mutex.unlock(); qDebug(vic.MINg!); } qDebug(end!); } void Thread::stop() { mutex.lock(); m_stop = true; mutex.unlock(); } 在这里QMutex能够完全完成互斥操作,但是有些情况下QMutex类是无法某些特定的互斥操作的,下面举个例子: 这里我们把void stop()函数,重新定义下,让他以布尔形式返回,实际也没有啥用...只为示例的演示效果~~ bool Thread::stop() { m_stop = true; return m_stop; } 现在问题出来了,如果要在st

文档评论(0)

htfyzc + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档