QMutex的目的是保护一个对象、数据结构或者代码段,所以同一时间只有一个线程可以访问它。(在Java术语中,它和同步关键字“synchronized”很相似)。例如,这里有一个方法打印给用户两条消息:
void someMethod()
{
qDebug("Hello");
qDebug("World");
}
如果同时在两个线程中调用这个方法,结果的顺序将是:
Hello
Hello
World
World
如果你使用了一个互斥量:
QMutex mutex;
void someMethod()
{
mutex.lock();
qDebug("Hello");
qDebug("World");
mutex.unlock();
}
然后同一时间只有一个线程可以运行someMethod并且消息的顺序也一直是正确的。Mutex也可以在
线程中使用的时候要保证mutex的定义在线程之外。
2
QThread类提供了与系统无关的线程。
QThread代表在程序中一个单独的线程控制,在多任务操作系统中,它和同一进程中的其它线程共享数据,但运行起来就像一个单独的程序一样。它不是在main()中开始,QThread是在run()中开始运行的。你继承run()并且在其中包含你的代码。例如:
class MyThread : public QThread { public: virtual void run(); }; void MyThread:: run() { for( int count = 0; count < 20; count++ ) { sleep( 1 ); qDebug( "Ping!" ); } } int main() { MyThread a; MyThread b; a. start(); b. start(); a. wait(); b. wait(); }这将会开始两个线程,每个线程在屏幕上写20次“Ping!”并且退出。在main()的结尾调用wait()是必需的,因为main()的结束会终结整个程序,它会杀掉所有其它线程。当每个MyThread运行到MyThread::run()结尾时,它就结束运行,就好像一个应用程序离开main()时所做的一样。
在这里要注意a.wait(),b.wait()的使用,他等待线程函数run()执行完毕后,退出主函数。否则在a.start()后还没有等到run函数执行,就退出主函数了。