QT多线程Qt对线程提供了支持,基本形式有独立于平台的线程类、线程安全方式的事件传递和一个全局Qt库互斥量允许你可以从不同的线程调用Qt方法。这个文档是提供给那些对多线程编程有丰富的知识和经验的听众的。推荐阅读:,ThreadsPrimer:AGuidetoMultithreadedProgramming,ThreadTime:TheMultithreadedProgrammingGuide,PthreadsProgramming:APOSIXStandardforBetterMultiprocessing(O'ReillyNutshell),Win32MultithreadedProgramming警告:所有的GUI类(比如,QWidget和它的子类),操作系统核心类(比如,QProcess)和网络类都是线程安全的。不QRegExp使用一个静态缓存并且也不是线程安全的,即使通过使用QMutex来保护的QRegExp对象。线程类最重要的类是QThread,也就是说要开始一个新的线程,就是开始执行你重新实现的QThread::run()。这和Java的线程类很相似。为了写线程程序,在两个线程同时希望访问同一个数据时,对数据进行保护是很必要的。因此这里也有一个QMutex类,一个线程可以锁定互斥量,并且在它锁定之后,其它线程就不能再锁定这个互斥量了,试图这样做的线程都会被阻塞直到互斥量被释放。例如:classMyClass{public:voiddoStuff(int);private:QMutexmutex;inta;intb;};//这里设置a为c,b为c*2。voidMyClass::doStuff(intc){();a=c;b=c*2;();}这保证了同一时间只有一个线程可以进入MyClass::doStuff(),所以b将永远等于c*2。另外一个线程也需要在一个给定的条件下等待其它线程的唤醒,QWaitCondition类就被提供了。线程等待的条件QWaitCondition指出发生了什么事情,阻塞将一直持续到这种事情发生。当某种事情发生了,QWaitCondition可以唤醒等待这一事件的线程之一或全部。(这和POSIX线程条件变量是具有相同功能的并且它也是Unix上的一种实现。)例如:#include<>#include<>//全局条件变量QWaitConditionmycond;//Worker类实现classWorker:publicQPushButton,publicQThread{Q_OBJECTpublic:Worker(QWidget*parent=0,constchar*name=0):QPushButton(parent,name){setText("StartWorking");//连接从QPushButton继承来的信号和我们的slotClicked()方法connect(this,SIGNAL(clicked()),SLOT(slotClicked()));//调用从QThread继承来的start()方法……这将立即开始线程的执行QThread::start();}publicslots:voidslotClicked(){//();}protected:voidrun(){//这个方法将被新创建的线程调用……while(TRUE){//锁定应用程序互斥锁,并且设置窗口标题来表明我们正在等待开始工作qApp->lock();setCaption("Waiting");qApp->unlock();//();//如果我们到了这里,我们已经被另一个线程唤醒……让我们来设置标题来表明我们正在工作qApp->lock();setCaption("Working!");qApp->unlock();//这可能会占用一些时间,几秒、几分钟或者几小时等等,因为这个一个和GUI线程分开的线程,在处理事件时,GUI线程不会停下来……plicated_thing();}}};//主线程——所有的GUI事件都由这个线程处理。intmain(intargc,char**argv){QApplicationapp(argc,argv);//创建一个worker……当我们这样做的时候,这个worker将在一个线程中运行Workerfirstworker(0,"worker");(&worker);();();}只要你按下按钮,这个程序就会
QT多线程 来自淘豆网www.taodocs.com转载请标明出处.