Qt学习之路—–QThread QMutex

August 6th, 2013 by JasonLe's Tech Leave a reply »

今天学习Qt的Thread库与信号量。

在qt中,开启线程,只需开启

MyThread mThread1;  mThread1.start(QThread::HighestPriority);

MyThread类继承QThread即可

线程执行函数要重写run(),在run()中写下要单独执行的函数段。

如果遇到原子操作,则需要声明QMutex,并将原子操作放入QMutex mutex      mutex.lock()    与  mutex.unlock()中间。

 

在Gui中应用thread可以使GUI免于失去响应

void MyThread::run()
{
this->stop = false;
for(;i<1000;i++)
{
QMutex mutex;
mutex.lock();
if(this->stop) break;
mutex.unlock();

emit NumberChanged(i);

this->msleep(100);
}
}

上面就是一个Thread与Mutex结合的范例,这样使得每次线程都会判断bool类型的stop是否为true。便于控制线程原子操作。

emit关键字在下一节讲解。

 

void QThread::run () [纯虚 保护]

这个方法是纯虚的,并且为了能够做有用的工作必须在继承类中被重新实现。这个方法的返回将会结束线程的执行。

也可以参考wait()。

void QThread::sleep ( unsigned long secs ) [静态 保护]

与系统无关的睡眠。这将导致当前线程睡眠secs秒。

bool QThread::wait ( unsigned long time = ULONG_MAX )

这将提供和POSIX pthread_join相似的功能。一个线程调用了它将会一直阻塞,知道下述条件之一满足时继续:

  • 这个QThread对象所关联的线程已经结束执行(比如,当它从run()中返回)。如果线程完成,这个函数将返回真。如果线程还没有开始呢,这个函数也返回真。
  • time毫秒过去了。如果time是ULONG_MAX(默认值),然后等待将永远不会超时(线程必须从run()中返回)。如果等待时间到了,这个函数将返回假。

看一段代码:
MyThread mThread1;
mThread1.setString(“Thread1”);
mThread1.start();
//mThread1.wait();

qDebug() << “Done!”;

那条wait()语句如果有的话,他会等待这个线程执行完毕之后,打印Done。

如果没有wait(),则程序会继续向下执行,也就是先打印Done ,然后执行线程函数。两者打印顺序不定,所以在同步中使用较多。

sleep和wait的区别有:
  1,这两个方法来自不同的类分别是Thread和Object
  2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
  3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
    任何地方使用
   synchronized(x){
      x.notify()
     //或者wait()
   }
   4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常