- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)