Windows消息处理与多线程编程 2.doc
文本预览下载声明
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
显示全部