久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10345|回復: 0
收起左側

CSerial串口類的關閉串口解決方法

[復制鏈接]
ID:60266 發表于 2014-8-18 02:06 | 顯示全部樓層 |閱讀模式
                        VCserialPort類加上關閉功能————我的解決方法(轉帖)(2010-11-2114:01:43)轉載▼
標簽: 串口通信 主線程 關閉功能 進行 中止 雜談   分類: 技術資料
VCserialPort類加上關閉功能————我的解決方法
20101015星期五 10:40
CSerialPort是一個很好的串口通訊類,但它沒有關閉串口的方法,如果對這個類的實現原理不了解,自行編寫串口關閉方法可能會帶來如下問題:
   1、用closehandle方法關閉串口:由于調用類方法StartMonitoring后會生成一個串口通信線程,這個線程中要不停地訪問串口,這種方法會帶來明顯的錯誤。
   2、先用StopMonitoring方法停止串口監聽,然后用closehandle關閉串口:由于StopMonitoring只是將進程掛起,這樣做將使程序結束時解構函數無法將中止事件發送到線程,可能導致程序不能完全退出,主窗口關閉后仍可在進程管理器中看到進程。
   3、先用SetEvent發送中止事件給線程,等待線程結束后再用closehandle關閉串口,程序如下:
voidCSerialPort::ClosePort()
{
// if thethread is alive: Kill
if(m_bThreadAlive)
{
   do
   {
   SetEvent(m_hShutdownEvent);
   } while(m_bThreadAlive);
   TRACE("Threadended\n");
}
if(m_szWriteBuffer != NULL)
{
   delete []m_szWriteBuffer;
   m_szWriteBuffer=NULL;
}
if(m_hComm)
{
  CloseHandle(m_hComm);
   m_hComm =NULL;
}
}
   這個程序在某些應用中可能會導致程序鎖死,比如要將連續、大量接收到的數據進行實時顯示或存盤時會發生這種情況,原因是:串口通信線程每接收到一個字符,都要用sendmessage通知主線程,而sendmail是阻塞式的,如果此時主線程正在關閉串口,會用do...while循環連續向串口通信線程,直到串口通信線程中止為止,這個過程也是阻塞式的,此時主線程在不斷判斷串口通信線程是否中止,通信線程發來的sendmessage消息進行處理,而通信線程則在等待sendmessage的返回,不會對主線程發來的中止信號進行處理,從而導致死鎖,進入漫長的超時等待狀態。由于消息處理及存盤、實時顯示等過程比較耗時,在對連續、大量接收到的數據進行此類操作時極易導致鎖死情況,導致這種情況的根本原因是sendmessage不是異步的。
    了解導致錯誤的原因,就可以采取針對性的措施進行避免,比如用postmessage替代sendmessage(可能會導致數據丟失),不使用do...while循環。
    將上面的ClosePort函數修改成以下形式:
voidCSerialPort::ClosePort()
{
// if thethread is alive: Kill
if(m_bThreadAlive)
{
   MSGmessage;
   while(m_bThreadAlive)
   {
   if(::PeekMessage(&message,m_pOwner->m_hWnd,0,0,PM_REMOVE))
   {
    ::TranslateMessage(&message);
    ::DispatchMessage(&message);
   }
   SetEvent(m_hShutdownEvent);
   }
   TRACE("Threadended\n");
}
if(m_szWriteBuffer != NULL)
{
   delete []m_szWriteBuffer;
   m_szWriteBuffer=NULL;
}
if(m_hComm)
{
  CloseHandle(m_hComm);
   m_hComm =NULL;
}
}
同時在ReceiveChar中加入對線程結束事件的判斷:
voidCSerialPort::ReceiveChar(CSerialPort* port, COMSTATcomstat)
{
BOOL bRead= TRUE;
.......
for(;;)
{
   //add bylgb
   //防止死鎖
if(WaitForSingleObject(port->m_hShutdownEvent,0)==WAIT_OBJECT_0)
   return;
......
}
   這樣將解決死鎖問題


回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费在线播放黄色 | 久久久久国产精品一区二区 | 91精品国产综合久久精品 | 午夜看片网站 | 欧美亚洲视频 | 免费精品久久久久久中文字幕 | 找个黄色片 | 日韩一区二区三区在线观看 | 亚洲欧洲激情 | 中文av网站 | 成人亚洲片| 久久久久久国产精品免费免费狐狸 | 伦理二区| 亚洲天堂中文字幕 | 久久中文字幕一区 | 国产精品久久久久久久久久久久 | 欧美精品一区二区在线观看 | 人人做人人澡人人爽欧美 | 欧美激情视频一区二区三区在线播放 | 日本免费在线 | 亚洲社区在线 | 久久久成人免费视频 | 有码一区| 黄色精品| 久久1区 | 久久亚洲欧美日韩精品专区 | 在线成人免费视频 | 欧美一级片在线看 | 国产在线观 | 91麻豆精品国产91久久久久久 | 免费成人在线网站 | 美女福利视频 | 第四色播日韩第一页 | 亚洲二区在线 | 亚洲一区二区视频 | 看特级黄色片 | 毛片一区 | 日本精品一区 | 天天狠狠| 日本免费黄色一级片 | 99精品视频在线观看免费播放 |