- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第八章 高级编程 多线程设计 进程和线程 进程是程序的一次执行;线程可以理解为进程中的执行的一段程序片段。两者间的差别: 在线程系统中进程也是一个线程。可以将进程理解为一个程序的第一个线程。 进程间是独立的; 进程是无法存取其他进程内的存储空间;同一进程所产生的线程共享同一内存空间; 同一进程中的两段代码不能够同时执行,除非引入线程; 线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除; 线程占用的资源要少于进程所占用的资源; 进程和线程都可以有优先级; 多线程设计 线程的启动 首先从类CwinThread产生一个派生类,同时使用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE来声明和实现这个CwinThread派生类。 然后根据需要重载该派生类的一些成员函数,如:ExitInstance();InitInstance();OnIdle();PreTranslateMessage()等函数。 最后启动该用户界面线程,调用AfxBeginThread()函数: CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ); 其中第一个参数为指向定义的用户界面线程类指针变量,第二个参数为线程的优先级,第三个参数为线程所对应的堆栈大小,第四个参数为线程创建时的附加标志,缺省为正常状态,如为CREATE_SUSPENDED则线程启动后为挂起状态。 多线程设计 线程的优先级 int GetThreadPriority(); BOOL SetThradPriority()(int nPriority); 线程的悬挂、恢复 SuspendThread()用来悬挂线程,暂停线程的执行; ResumeThread()用来恢复线程的执行。 终止线程 线程可以在自身内部调用AfxEndThread()来终止自身的运行; 可以在线程的外部调用BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode )来强行终止一个线程的运行,然后调用CloseHandle()函数释放线程所占用的堆栈; 改变全局变量,使线程的执行函数返回,则该线程终止。 多线程设计 线程之间的通信 利用用户定义的消息通信 : 用户先要定义一个用户消息,#define WM_USERMSG WMUSER+100;这样在需要的时候,可以调用下面两个函数中的任一个向另外一个线程发送这个消息, ::PostMessage((HWND)param,WM_USERMSG,0,0) CwinThread::PostThradMessage() 用事件对象实现通信 在线程之间传递信号进行通信还可以使用事件对象,用MFC的Cevent类的对象来表示。线程可以监视处于有信号状态的事件,以便在适当的时候执行对事件的操作。 多线程设计 线程之间的同步 临界区: 临界区是保证在某一个时间只有一个线程可以访问数据的方法。临界区对应着一个CcriticalSection对象,当线程需要访问保护数据时,调用临界区对象的Lock()成员函数;当对保护数据的操作完成之后,调用临界区对象的Unlock()成员函数释放对临界区对象的拥有权。 互斥 互斥不仅可以在同一应用程序的线程间实现同步,还可以在不同的进程间实现同步,从而实现资源的安全共享。互斥与Cmutex类的对象相对应,使用互斥对象时,必须创建一个CSingleLock或CMultiLock对象,用于实际的访问控制,该对象的Lock()函数用于占有互斥,Unlock()用于释放互斥。 信号量 信号量可以同一时刻允许多个线程访问同一个资源,创建一个信号量需要用Csemaphore类声明一个对象,一旦创建了一个信号量对象,就可以用它来对资源访问。要实现计数处理,先创建一个CsingleLock或CmltiLock对象,然后用该对象的Lock()函数减少这个信号量的计数值,Unlock()反之。 动态链接库 Win32 DLL方式创建Non-MFC DLL动态链接库 在Non-MFC DLL中DllMain是一个缺省的入口函数,不需要编写自己的DLL入口函数,用这个缺省的入口函数就能使动态链接库被调用时得到正确的初始化。 可以在DLL工程中加入想要输出的函数或变量。 DLL是包含若干个函数的
原创力文档


文档评论(0)