Windows的消息处理与多线程编程 2.doc_第1页
Windows的消息处理与多线程编程 2.doc_第2页
Windows的消息处理与多线程编程 2.doc_第3页
Windows的消息处理与多线程编程 2.doc_第4页
Windows的消息处理与多线程编程 2.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Hejun 5292 WindowsWindows 的消息处理与多线程编程的消息处理与多线程编程 MFC 篇篇 1 WINDOWS消息处理 1 单位线程是如何处理消息的 1 放弃控制 2 计时器 2 多线程编程 3 编写工作者线程函数并启动线程 3 主线程如何与工作线程使用全局变量通讯 3 工作者线程与主线程通讯发送消息进行联络 4 使用事件进行线程同步 4 临界段 5 用户接口线程 5 WIN32 SDK 篇篇 5 事件的使用方法 5 线程的创建方法 5 临界区的使用方法 6 Hejun 5292 MFC 篇篇 Windows 消息处理 单位线程是如何处理消息的 Windows 的消息处理机制是用如下代码进行消息处理的 MSG message While GetMessage DispatchMessage 当消息到达时 由 TranslateMessage 进行必要的转换 例如 将 WM KEYDOWN 消息转 换为包含有 ASCII 字符的 WM CHAR 消息 然后由 DispatchMessage 进行发送 当处 理完成后 DispatchMessage 返回 放弃控制 如果在等待方式下 DispatchMessage 必须等待处理完成后才能返回 在此之前将 不能处理任何消息 而下面的代码可以做到即使没有消息到达程序的情况下也立即返回 MSG message While PeekMessage DispatchMessage 计时器 计时器是不依赖 CPU 的时钟速度的 注意的是因为 Windows 并不是实时的操作系 统 所以 如果你指定的周期小于 100 毫秒的话 计时器事件之间的周期可能不精确 有了计时器 有时可以替代多线程情况 例如下面的代码就允许在循环内仍然接收处理 消息 这是一个进度条 在 OnTimer 里面改动进度条的显示 同时可以自定义 Hejun 5292 CANCEL 消息 在 OnCancel 中将程序终止 Void CDlg OnStart MSG message SetTimer 0 100 NULL GetDlgItem IDC START EnableWindow FALSE 使按钮无效 Volatile int nTemp 使变更不保存在寄存器中 因为变量如果保存在寄存 器中 在线程的切换过程中可能会出现值的错误 For m nCount 0 m nCount nMaxCount m nCount For nTemp 0 nTemp 10000 nTemp if PeekMessage DispatchMessage CDlg OnOK 线程结束后关闭对话框 多线程编程多线程编程 进程是拥有自己的内存 文件句柄和其他系统资源的运行程序 单个进程可以包含 独立的执行 叫线程 Windows 提供了两种线程 工作者 worker 线程和用户界面线程 用户界面线程 通常有窗口 且具有自己的消息循环 工作者线程没有窗口 因此它不需要处理消息 编写工作者线程函数并启动线程 线程体一般是如何形式 UINT ThreadProc LPVOID pParam return 0 Hejun 5292 启动线程使用 CwinThread pThread AfxBeginThread ThreadProc GetSafeHwnd THREAD PRIORITY NORMAL 主线程如何与工作线程使用全局变量通讯 全局变量通讯是最简单而有效的办法 例如下面的代码 UINT ThreadProc LPVOID pParam g nCount 0 while g nCount 100 InterlockedIncrement long return 0 InterLockIncrement 函数在变量加 1 期间阻塞其他线程访问该变量 如果不使 用此函数而直接使用 g nCount 的话 可能会出现错误 工作者线程与主线程通讯发送消息进行联络 下面的代码 当线程完成后发送给父进程消息 UINT ThreadProc LPVOID pParam PostMessage HWND pParam WM THREADFINISHED 0 0 return 0 使用事件进行线程同步 Cevent 类是一个事件类 刚定义时处于 非信号 状态 可以调用 SetEvent 成 员函数置它为 信号 状态 下面的代码 线程首先等待开始信号 如果没有置开始信号会一直挂起等待 同时 在运行的过程中等待结束信号 如果结束信号发生就终止线程 Cevent g eventStart g eventKill Hejun 5292 UINT ThreadProc LPVOID pParam INFINITE 表示等待无限时间 WaitForSingleObject g eventtart INFINITE for If WaitForSingleObject g eventKill 0 WAIT OBJECT 0 Break return 0 当启动线程时 g eventStart SetEvent 当终止线程时 g eventKill SetEvent 但在终止线程时如果还没有启动线程 则应该先启动线程再终止它 注意 线程如果不正常终止会引起内存泄漏 例如用关闭进程的方法来强制终止线 程 或使用 Win32 TerminateThread 函数 临界段 使用 CcriticalSection 类可以将临界段句柄包装起来 例如 CcriticalSection g cs G cs Lock G nCount G cs Unlock 用户接口线程 一般使用用户接口线程是想要得到多个顶级窗口 例如你想允许用户运行程序的多个 实例 但是你想让所有的实例都共享内存 IE 就是这样的 你可以从 CwinThread 来派 生一个类 使用 AfxBeginThread 的重载版本来启动该线程 派生的这个类具有它自己 的 InitInstance 函数 并且具有自己的消息循环 Hejun 5292 Win32 SDK 篇篇 事件的使用方法 HANDLEg hCloseEvent NULL g hCloseEvent CreateEvent NULL TRUE FALSE NULL if g hCloseEvent NULL return FALSE 设置信号 SetEvent g hCloseEvent 线程的创建方法 线程体的一般形式 DWORD WINAPI ThreadProc LPVOID pParam return 0 创建时 HANDLE hReceiveThread NULL UINT ThreadID hReceiveThread CreateThread NULL 0 ThreadProc hWnd 0 if hReceiveThread NULL return FALSE 优先级为普通 SetThreadPriority hReceiveThread THREAD PRIORITY NORM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论