收藏 分享(赏)

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

上传人:gnk289057 文档编号:5153598 上传时间:2019-02-10 格式:DOC 页数:6 大小:58KB
下载 相关 举报
Windows的消息处理与多线程编程 2.doc_第1页
第1页 / 共6页
Windows的消息处理与多线程编程 2.doc_第2页
第2页 / 共6页
Windows的消息处理与多线程编程 2.doc_第3页
第3页 / 共6页
Windows的消息处理与多线程编程 2.doc_第4页
第4页 / 共6页
Windows的消息处理与多线程编程 2.doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

1、 Hejun 5292Windows 的消息处理与多线程编程MFC篇 1WINDOWS消息处理 1单 位 线 程是如何 处 理消息的 1放弃控制 2计时 器 2多线程编程 3编 写工作者 线 程函数并启 动线 程 3主 线 程如何与工作 线 程使用全局 变 量通 讯 3工作者 线 程与主 线 程通 讯发 送消息 进 行 联络 4使用事件 进 行 线 程同步 4临 界段 5用 户 接口 线 程 5WIN32 SDK篇 5事件的使用方法 5线 程的 创 建方法 5临 界区的使用方法 6Hejun 5292MFC篇Windows 消息处理单位线程是如何处理消息的Windows的消息 处理机制是用如下

2、代 码进行消息 处理的:MSG message;While(:GetMessage(:DispatchMessage(当消息到达时, 由 TranslateMessage进行必要的 转换,例如:将 WM_KEYDOWN消息转换为包含有 ASCII字符的 WM_CHAR消息,然后由 DispatchMessage进行发送, 当处理完成后,DispatchMessage 返回.放弃控制如果在等待方式下,DispatchMessage 必须等待处理完成后才能返回, 在此之前将不能处理任何消息, 而下面的代 码可以做到即使没有消息到达程序的情况下也立即返回MSG message;While(:Peek

3、Message(:DispatchMessage(计时器计时器是不依赖 CPU的时钟速度的. 注意的是因 为 Windows并不是实时的操作系统,所以,如果你指定的周期小于 100毫秒的话,计时器事件之间的周期可能不精确.有了计时器, 有时可以替代多 线程情况, 例如下面的代码就允许在循环内仍然接收处理消息. 这是一个 进度条 , 在 OnTimer里面改 动进度条的显示, 同时可以自定义Hejun 5292CANCEL消息, 在 OnCancel中将程序终止.Void CDlg:OnStart()MSG message;SetTimer(0,100,NULL);GetDlgItem(IDC_

4、START)-EnableWindow(FALSE); / 使按钮无效Volatile int nTemp; /使变更不保存在寄存器中 , 因为变量如果保存在寄存器中, 在线程的切 换过程中可能会出 现值的错误.For (m_nCount=0;m_nCountnMaxCount;m_nCount+)For (nTemp=0;nTemp10000;nTemp+)if (:PeekMessage(:DispatchMessage(CDlg:OnOK(); / 线程结束后关闭对话框多线程编程进程是拥有自己的内存, 文件句柄和其他系 统资源的运行程序, 单个进程可以包含独立的执行, 叫线程.Windo

5、ws提供了两种 线程 , 工作者(worker) 线 程和用户界面线程, 用户界面线程通常有窗口, 且具有自己的消息循 环. 工作者线程没有窗口 ,因此它不需要处理消息.编写工作者线程函数并启动线程线程体一般是如何形式:UINT ThreadProc(LPVOID pParam)return 0;Hejun 5292启动线程使用:CwinThread* pThread = AfxBeginThread(ThreadProc,GetSafeHwnd(),THREAD_PRIORITY_NORMAL);主线程如何与工作线程使用全局变量通讯全局变量通讯是最简单而有效的办法.例如下面的代码:UINT

6、ThreadProc(LPVOID pParam)g_nCount = 0;while(g_nCount100):InterlockedIncrement(long*)return 0;InterLockIncrement函数在变量加 1期间阻塞其他 线程访问该变量. 如果不使用此函数而直接使用:g_nCount+的话, 可能会出现错误.工作者线程与主线程通讯发送消息进行联络下面的代码: 当线程完成后 发送给父进程消息UINT ThreadProc(LPVOID pParam):PostMessage(HWND)pParam,WM_THREADFINISHED,0,0);return 0;使用

7、事件进行线程同步Cevent类是一个事件类,刚定义时处于“ 非信号“状态, 可以调用 SetEvent()成员函数置它为“ 信号“ 状态 .下面的代码: 线程首先等待开始信号 , 如果没有置开始信号会一直挂起等待 , 同时在运行的过程中等待结束信号, 如果结束信号发生就 终止线程.Cevent g_eventStart,g_eventKill;Hejun 5292UINT ThreadProc(LPVOID pParam)/INFINITE表示等待无限时间:WaitForSingleObject(g_eventtart,INFINITE); for ().If(:WaitForSingleOb

8、ject(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.U

9、nlock();用户接口线程一般使用用户接口线程是想要得到多个顶级窗口,例如你想允许用户运行程序的多个实例,但是你想 让所有的实 例都共享内存,IE 就是这样的. 你可以从 CwinThread来派生一个类,使用 AfxBeginThread的重载版本来启动该线程,派生的这个类具有它自己的 InitInstance函数,并且具有自己的消息循环.Hejun 5292Win32 SDK篇事件的使用方法HANDLE g_hCloseEvent = NULL;g_hCloseEvent = CreateEvent(NULL, TRUE, FALSE, NULL);if (g_hCloseEvent =

10、 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_NORMAL);临界区的使用方法CRITICAL_SECTION csRecvRead = 0;InitializeCriticalSection( / 临界区初始化EnterCriticalSection( / 使用临界区变量pRightBuffer = pRightBuffer + len;LeaveCriticalSection(

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > windows相关

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报