《QT编程课件-第十一章-进程和线程ppt.ppt》由会员分享,可在线阅读,更多相关《QT编程课件-第十一章-进程和线程ppt.ppt(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、3Sept.2008NeusoftConfidential为了规范事业单位聘用关系,建立和完善适应社会主义市场经济体制的事业单位工作人员聘用制度,保障用人单位和职工的合法权益Linux图形编程图形编程QT为了规范事业单位聘用关系,建立和完善适应社会主义市场经济体制的事业单位工作人员聘用制度,保障用人单位和职工的合法权益QT 编程编程第第11章章 进程和线程进程和线程目标:本章旨在向学员介绍各种窗口部件:掌握Qt启动进程和线程的方法掌握进程间和线程间通讯方法学时:学时:3 3 学时学时教学方法:讲授教学方法:讲授pptppt上机操上机操作作+实例演示实例演示为了规范事业单位聘用关系,建立和完善适
2、应社会主义市场经济体制的事业单位工作人员聘用制度,保障用人单位和职工的合法权益进程(进程(QProgress)QProgress:QT提供了一个提供了一个QProcess类用于启动一个外部程序并与之通信。类用于启动一个外部程序并与之通信。QProcess:start():非阻塞:非阻塞QProcess:execute()阻塞阻塞,即execute()=start()+waitforFinished()QProgress可以挂起调用线程,等待相应的信号被发射可以挂起调用线程,等待相应的信号被发射Qprogress:waitForStarted():阻塞线程,直到进程启动Qprogress:wai
3、tForReadyRead():阻塞线程,直到有可读数据Qprogress:waitForBytesWritten():阻塞线程,直到写入bytes字节数据Qprogress:waitForFinished():阻塞线程,直到进程终了QProgress提供提供3种状态,并在状态改变时发射信号。种状态,并在状态改变时发射信号。注:注:QProgress继承自继承自QIODevice,将进程视为,将进程视为IO设备,可以进行读写操作。设备,可以进行读写操作。StartingQProcess:startRunning程序开始运行NotRunning程序退出Q_SIGNALS:voidstarted(
4、);Q_SIGNALS:voidfinished();为了规范事业单位聘用关系,建立和完善适应社会主义市场经济体制的事业单位工作人员聘用制度,保障用人单位和职工的合法权益进程间通信进程间通信QT提供了多种方法实现进程间通信(提供了多种方法实现进程间通信(IPC:Inter-ProcessCommunication)1TCP/IP通过通过QtNetwork模块,实现跨平台的网络通信。模块,实现跨平台的网络通信。2共享内存共享内存:QShareMemory:实现操作系统内多个线程和进程访问共享内存段。:实现操作系统内多个线程和进程访问共享内存段。3D-bus:QtDBus模块是一个模块是一个UNI
5、X库,可以使用库,可以使用D-Bus协议来进行进程通信,协议来进行进程通信,需要依赖第需要依赖第3方库。方库。4Qt通信协议(通信协议(QCOP)a.QCopChannel:实现了在客户端程序间使用有名管道通信,只用于:实现了在客户端程序间使用有名管道通信,只用于嵌入式设备。嵌入式设备。b.QLocalSocket/QLocalServer:使用本地套接字进行服务,使用方法使用本地套接字进行服务,使用方法类似于类似于QTcpSocket/QTcpServer。为了规范事业单位聘用关系,建立和完善适应社会主义市场经济体制的事业单位工作人员聘用制度,保障用人单位和职工的合法权益共享内存(共享内存(
6、QSharedMemory)共享内存(共享内存(QSharedMemory):实现操作系统内多个线程和进程访问共):实现操作系统内多个线程和进程访问共享内存段。享内存段。QSharedMemory:attach()挂载共享内存挂载共享内存QSharedMemory:detach()卸载共享内存卸载共享内存QSharedMemory:setKey()共享内存段标识共享内存段标识QSharedMemory:create()创建内存创建内存QSharedMemory:lock()加锁内存加锁内存QSharedMemory:unlock()解锁内存解锁内存为了规范事业单位聘用关系,建立和完善适应社会主
7、义市场经济体制的事业单位工作人员聘用制度,保障用人单位和职工的合法权益本地套接字本地套接字本地套接字(本地套接字(QLocalSocket/QLocalServer):使用本地套接字进行服务,使用使用本地套接字进行服务,使用方法类似于方法类似于QTcpSocket/QTcpServer。windows版本版本:有名管道有名管道实现实现UNIX版本版本:本地域套接字本地域套接字实现实现建立连接建立连接QLocalServerQLocalServer*server*serverserver-server-listen(listen()QLocalSocketQLocalSocket*socket*
8、socketsocket-socket-connectToServer()connectToServer()socketsocketQLocalSocket:QLocalSocket:readyRead()readyRead()服务器进程服务器进程客户进程客户进程SIGNAL(newConnection()SIGNAL(newConnection()QLocalServer:nextPendingConnection()QLocalServer:nextPendingConnection()QLocalSocket:write QLocalSocket:write断开连接断开连接socket
9、socket-disconnectFromServer()disconnectFromServer()QLocalServer QLocalServer:SLOT(deleteLater()SLOT(deleteLater()为了规范事业单位聘用关系,建立和完善适应社会主义市场经济体制的事业单位工作人员聘用制度,保障用人单位和职工的合法权益线程线程(QThread)QThread代表在应用程序中可以独立控制的线程,他与进程中的其他线程共享数代表在应用程序中可以独立控制的线程,他与进程中的其他线程共享数据,但是独立运行。据,但是独立运行。QThread:run():子类重写Run函数,实现线程逻
10、辑。QThread:start():启动线程,它内部默认调用run函数。QThread提供的信号(信号(Q_SIGNALS):voidstarted();线程启动后发射voidfinished();线程结束后发射voidterminated();线程终止后发射QThread提供的休眠休眠函数:staticvoidsleep(unsignedlong):按秒秒为单位休眠staticvoidmsleep(unsignedlong):按毫秒毫秒为单位休眠staticvoidusleep(unsignedlong):按微秒微秒为单位休眠同步同步函数:boolwait():让子线程和主线程同步线程内的事
11、件事件机制:intexec():开启开启线程内的事件循环exit()或或quit():退出事件事件循环为了规范事业单位聘用关系,建立和完善适应社会主义市场经济体制的事业单位工作人员聘用制度,保障用人单位和职工的合法权益互斥量(互斥量(QMutex)QMutex类提供的是线程之间的访问顺序化类提供的是线程之间的访问顺序化,它的目的是保护一个对象、数据结构它的目的是保护一个对象、数据结构或者代码段,所以同一时间只有一个线程可以访问它。或者代码段,所以同一时间只有一个线程可以访问它。QMutex:QMutex(boolrecursive=FALSE)构造一个新的互斥量。这个互斥量是在没有锁定的状态下
12、创建的。如果recursive为真,就构造一个递归互斥量递归互斥量,如果recursive为假(默认值),就构造一个普通互斥量普通互斥量。对于一个递归互斥量,一个线程可以锁定一个互斥量多次并且只有在相同数量的unlock调用之后,它才会被解锁。QMutex:locked():锁定锁定一个互斥量QMutex:unlock():解锁解锁这个互斥量QMutex:tryLock():试图锁定互斥量。如果锁被得到,这个函数返回真。如果另一个进程已经锁定了这个互斥量,这个函数返回假,而不是一直等到这个锁可用为止,注意,它不是阻塞的它不是阻塞的。QMutexLocker:简化:简化互斥量的锁定和解锁操作QM
13、utexLocker创建创建后,互斥量就锁定锁定了。QMutexLocker销毁的时候销毁的时候,自动实现互斥量解锁解锁。voidcomplexFunction()QMutexLockerlocker(&mutex);/创建后锁定创建后锁定/退出函数后,栈对象销毁,自动解锁。退出函数后,栈对象销毁,自动解锁。为了规范事业单位聘用关系,建立和完善适应社会主义市场经济体制的事业单位工作人员聘用制度,保障用人单位和职工的合法权益读写锁读写锁(QReadWriteLock)读写锁读写锁(QReadWriteLock):QReadWriterLock对对“read”,“write”访问进行区别访问进行区
14、别对待,写线程执行的时候会阻塞所有的读线程,而读线程之间的运行不需要进行对待,写线程执行的时候会阻塞所有的读线程,而读线程之间的运行不需要进行同步同步,使得多线程程序更具有并发性。,使得多线程程序更具有并发性。QReadWriteLock:lockForRead()以以读读的方式加锁线程的方式加锁线程QReadWriteLock:lockForWrite()以以写写的方式加锁线程的方式加锁线程QReadLocker和QWriteLocker:是一组方便的类,是一组方便的类,可以自动死锁和解锁一个可以自动死锁和解锁一个QReadWriteLock类。类。QReadWriteLocklock;vo
15、idReaderThread:run()QReadLockerlocker(&lock);read_file();voidWriterThread:run()QWriteLockerlocker(&lock);write_file();为了规范事业单位聘用关系,建立和完善适应社会主义市场经济体制的事业单位工作人员聘用制度,保障用人单位和职工的合法权益信号量信号量(QSemaphore)信号量信号量(Qsemaphore):也可以被用来使线程的执行顺序化,和也可以被用来使线程的执行顺序化,和QMutex的方法相的方法相似。信号量和互斥量的不同在于,信号量可以在同一时间被多于一个的线程访问。似。信
16、号量和互斥量的不同在于,信号量可以在同一时间被多于一个的线程访问。QSemaphore:available():返回信号量当前可使用的访问的数量。QSemaphore:acquire()试图得到信号量的访问。如果available()=0,这个调用将会阻塞,一直到它能够得到访问。QSemaphore:release()释放信号量的访问。这将会唤醒所有等待访问这个信号量的线程。QSemaphore:tryAcquire()尝试申请信号量资源,没有足够资源,该函数会立即返回。(非阻塞)QSemaphoresem(5);/sem.available()=5sem.acquire(3);/sem.av
17、ailable()=2sem.acquire(2);/sem.available()=0sem.release(5);/sem.available()=5sem.release(5);/sem.available()=10sem.tryAcquire(1);/sem.available()=9,returns truesem.tryAcquire(250);/sem.available()=9,returns false为了规范事业单位聘用关系,建立和完善适应社会主义市场经济体制的事业单位工作人员聘用制度,保障用人单位和职工的合法权益条件变量条件变量(QWaitCondition)条件变量条件
18、变量(QWaitCondition):它允许线程在一定条件下唤醒其他线程。它允许线程在一定条件下唤醒其他线程。1boolwait(QMutex*mutex,unsignedlongtime=ULONG_MAX)mutex必须由调用线程进行初锁定初锁定。释放释放锁定的mutex。在线程对象上等待等待。等待结束后恢复恢复锁定状态。2voidwakeAll()这将会唤醒所有唤醒所有等待QWaitCondition的线程。这些线程被唤醒的顺序依赖于操组系统的调度策略,并且不能被控制或预知。3voidwakeOne()这将会唤醒所有所有等待QWaitCondition的线程中的一个线程中的一个线程。这个被唤醒的线程依赖于操组系统的调度策略,并且不能被控制或预知。为了规范事业单位聘用关系,建立和完善适应社会主义市场经济体制的事业单位工作人员聘用制度,保障用人单位和职工的合法权益谢谢!谢谢!Copyright2008版权所有东软集团