Windows消息处理与多线程编程 2.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Windows消息处理与多线程编程 2

Windows的消息处理与多线程编程 TOC \o 1-3 MFC篇 PAGEREF _Toc428090671 \h 1 Windows消息处理 PAGEREF _Toc428090672 \h 1 单位线程是如何处理消息的 PAGEREF _Toc428090673 \h 1 放弃控制 PAGEREF _Toc428090674 \h 2 计时器 PAGEREF _Toc428090675 \h 2 多线程编程 PAGEREF _Toc428090676 \h 3 编写工作者线程函数并启动线程 PAGEREF _Toc428090677 \h 3 主线程如何与工作线程使用全局变量通讯 PAGEREF _Toc428090678 \h 3 工作者线程与主线程通讯发送消息进行联络 PAGEREF _Toc428090679 \h 4 使用事件进行线程同步 PAGEREF _Toc428090680 \h 4 临界段 PAGEREF _Toc428090681 \h 5 用户接口线程 PAGEREF _Toc428090682 \h 5 Win32 SDK篇 PAGEREF _Toc428090683 \h 5 事件的使用方法 PAGEREF _Toc428090684 \h 5 线程的创建方法 PAGEREF _Toc428090685 \h 5 临界区的使用方法 PAGEREF _Toc428090686 \h 6 MFC篇 Windows消息处理 单位线程是如何处理消息的 Windows的消息处理机制是用如下代码进行消息处理的: MSG message; While(::GetMessage(message,NULL,0,0)){ ::TranslateMessage(message); ::DispatchMessage(message); } 当消息到达时,由TranslateMessage进行必要的转换,例如:将WM_KEYDOWN消息转换为包含有ASCII字符的WM_CHAR消息,然后由DispatchMessage进行发送,当处理完成后,DispatchMessage返回. 放弃控制 如果在等待方式下,DispatchMessage必须等待处理完成后才能返回,在此之前将不能处理任何消息,而下面的代码可以做到即使没有消息到达程序的情况下也立即返回 MSG message; While(::PeekMessage(message,NULL,0,0,PM_REMOVE)){ ::TranslateMessage(message); ::DispatchMessage(message); } 计时器 计时器是不依赖CPU的时钟速度的. 注意的是因为Windows并不是实时的操作系统,所以,如果你指定的周期小于100毫秒的话,计时器事件之间的周期可能不精确. 有了计时器,有时可以替代多线程情况, 例如下面的代码就允许在循环内仍然接收处理消息. 这是一个进度条, 在OnTimer里面改动进度条的显示, 同时可以自定义CANCEL消息, 在OnCancel中将程序终止. Void CDlg::OnStart() { MSG message; SetTimer(0,100,NULL); GetDlgItem(IDC_START)-EnableWindow(FALSE); // 使按钮无效 Volatile int nTemp; //使变更不保存在寄存器中, 因为变量如果保存在寄存器中, 在线程的切换过程中可能会出现值的错误. For (m_nCount=0;m_nCountnMaxCount;m_nCount++){ For (nTemp=0;nTemp10000;nTemp++){ ……… } if (::PeekMessage(message,NULL,0,0,PM_REMOVE)){ ::TranslateMessage(message); ::DispatchMessage(message); } } CDlg::OnOK(); // 线程结束后关闭对话框 } 多线程编程 进程是拥有自己的内存,文件句柄和其他系统资源的运行程序, 单个进程可以包含独立的执行,叫线程. Windows提供了两种线程, 工作者(worker)线程和用户界面线程, 用户界面线程通常有窗口,且具有自己的消息循环.工作者线程没有窗口,因此它不需要处理消息. 编写工作者线程函数并启动线程 线程体一般是如何形式: UINT ThreadProc(LPVOID pParam) { return 0; } 启动线程使用: CwinThread* p

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档