| 网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 |
![]() |
| Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道 |
方法三 多线程下实现串行通信
网管u家www.bitscn.net
方法一,二适用于单线程通信。在很多工业控制系统中,常通过扩展串口连接多个外设,各外设发送数据的重复频率不同,要求后台实时无差错捕捉,采集,处理,记录各端口数据,这就需要在自定义的串行通信类中创建端口监视线程,以便在指定的事件发生时向相关的窗口发送通知消息。
线程的基本概念可详见VC++参考书目,Windows内部的抢先调度程序在活动的线程之间分配CPU时间,Win 32 区分两种不同类型的线程,一种是用户界面线程UI(User Interface Thread),它包含消息循环或消息泵,用于处理接收到的消息;另一种是工作线程(Work Thread),它没有消息循环,用于执行后台任务。用于监视串口事件的线程即为工作线程。
网管下载dl.bitscn.com
多线程通信类的编写在端口的配置,连接部分与单线程通信类相同,在端口配置完毕后,最重要的是根据实际情况,建立多线程之间的同步对象,如信号灯,临界区,事件等,相关细节可参考VC++ 中的同步类。 网管有家www.bitscn.net
一切就绪后即可启动工作线程:
| CWinThrea *CommThread = AfxBeginThread(CommWatchThread, // 线程函数名 (LPVOID) m_pTTYInfo, // 传递的参数 THREAD_PRIORITY_ABOVE_NORMAL, // 设置线程优先级 (UINT) 0, // 最大堆栈大小 (DWORD) CREATE_SUSPENDED , // 创建标志 (LPSECURITY_ATTRIBUTES) NULL); // 安全性标志 |
同时,在串口事件监视线程中: 网管网www_bitscn_com
| if(WaitCommEvent(pTTYInfo->idComDev,&dwEvtMask,NULL)) { if((dwEvtMask & pTTYInfo->dwEvtMask )== pTTYInfo->dwEvtMask) { WaitForSingleObject(pTTYInfo->hPostEvent,0xFFFFFFFF); ResetEvent(pTTYInfo->hPostEvent); // 置同步事件对象为非信号态 ::PostMessage(CSampleView,ID_COM1_DATA,0,0); // 发送通知消息 } } |
用PostMessage()向指定窗口的消息队列发送通知消息,相应地,需要在该窗口建立消息与成员函数间的映射,用ON_MESSAGE将消息与成员函数名关联。 中国网管联盟bitsCN.com
| BEGIN_MESSAGE_MAP(CSampleView, CView) //{ { AFX_MSG_MAP(CSampleView)ON_MESSAGE(ID_COM1_DATA, OnProcessCom1Data) ON_MESSAGE(ID_COM2_DATA, OnProcessCom2Data) ..... /
相关文章列表
评论加载中…
1.vs2008破解继续使用方法
2.Visual C#多线程参数传递浅析 3.VS在Debug时检测到Loaderlock的解决办法 4.使用C#的BitmapData编程实例 5..NET Web开发震撼之变:.NET MVC框架 6.VC下实现定时任务的方法讨论 7.怎样在 Visual C# .NET 中跟踪和调试 8.C #中的几个线程同步对象方法 |