资源描述:
《Windows的消息处理与多线程编程 2》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Hejun5292Windows的消息处理与多线程编程MFC篇1Windows消息处理1单位线程是如何处理消息的1放弃控制2计时器2多线程编程3编写工作者线程函数并启动线程3主线程如何与工作线程使用全局变量通讯3工作者线程与主线程通讯发送消息进行联络4使用事件进行线程同步4临界段5用户接口线程5WIN32SDK篇5事件的使用方法5线程的创建方法5临界区的使用方法6Hejun5292MFC篇Windows消息处理单位线程是如何处理消息的Windows的消息处理机制是用如下代码进行消息处理的:MSGmessa
2、ge;While(::GetMessage(&message,NULL,0,0)){::TranslateMessage(&message);::DispatchMessage(&message);}当消息到达时,由TranslateMessage进行必要的转换,例如:将WM_KEYDOWN消息转换为包含有ASCII字符的WM_CHAR消息,然后由DispatchMessage进行发送,当处理完成后,DispatchMessage返回.放弃控制如果在等待方式下,DispatchMessage必须等待处理完
3、成后才能返回,在此之前将不能处理任何消息,而下面的代码可以做到即使没有消息到达程序的情况下也立即返回MSGmessage;While(::PeekMessage(&message,NULL,0,0,PM_REMOVE)){::TranslateMessage(&message);::DispatchMessage(&message);}计时器计时器是不依赖CPU的时钟速度的.注意的是因为Windows并不是实时的操作系统,所以,如果你指定的周期小于100毫秒的话,计时器事件之间的周期可能不精确.有了计时器
4、,有时可以替代多线程情况,例如下面的代码就允许在循环内仍然接收处理消息.这是一个进度条,在OnTimer里面改动进度条的显示,同时可以自定义CANCELHejun5292消息,在OnCancel中将程序终止.VoidCDlg::OnStart(){MSGmessage;SetTimer(0,100,NULL);GetDlgItem(IDC_START)->EnableWindow(FALSE);//使按钮无效VolatileintnTemp;//使变更不保存在寄存器中,因为变量如果保存在寄存器中,在线程的
5、切换过程中可能会出现值的错误.For(m_nCount=0;m_nCount6、资源的运行程序,单个进程可以包含独立的执行,叫线程.Windows提供了两种线程,工作者(worker)线程和用户界面线程,用户界面线程通常有窗口,且具有自己的消息循环.工作者线程没有窗口,因此它不需要处理消息.编写工作者线程函数并启动线程线程体一般是如何形式:UINTThreadProc(LPVOIDpParam){return0;}Hejun5292启动线程使用:CwinThread*pThread=AfxBeginThread(ThreadProc,GetSafeHwnd(),THREAD_PRIO
7、RITY_NORMAL);主线程如何与工作线程使用全局变量通讯全局变量通讯是最简单而有效的办法.例如下面的代码:UINTThreadProc(LPVOIDpParam){g_nCount=0;while(g_nCount<100)::InterlockedIncrement((long*)&g_nCount);return0;}InterLockIncrement函数在变量加1期间阻塞其他线程访问该变量.如果不使用此函数而直接使用:g_nCount++的话,可能会出现错误.工作者线程与主线程通讯发送消息进
8、行联络下面的代码:当线程完成后发送给父进程消息UINTThreadProc(LPVOIDpParam){………::PostMessage((HWND)pParam,WM_THREADFINISHED,0,0);return0;}使用事件进行线程同步Cevent类是一个事件类,刚定义时处于"非信号"状态,可以调用SetEvent()成员函数置它为"信号"状态.下面的代码:线程首先等待开始信号,如果没有置开始信号会一直挂起等待,同