亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? vcthread.cpp

?? c++實現的一個個串口通訊類
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
      }
      // Its possible that multiple errors occured and were handled
      // in the last ClearCommError.  Because all errors were signaled
      // individually, but cleared all at once, pending comm events
      // can yield EV_ERR while dwErrors equals 0.  Ignore this event.
      if (! ReceiveError( dwErrors )) return false;
      return true;
   }
   else
   {
      PostHangupCall();
      return false;
   }
}// {TReadThread.HandleCommEvent}

bool TReadThread::HandleReadEvent( OVERLAPPED* lpOverlappedRead,LPSTR lpszInputBuffer,DWORD dwSizeofBuffer,DWORD & lpnNumberOfBytesRead)
{
   DWORD dwLastError;
   //Result = false;
   if (GetOverlappedResult( m_hCommFile,lpOverlappedRead, &lpnNumberOfBytesRead, false ) )
   {
       return( HandleReadData( lpszInputBuffer, lpnNumberOfBytesRead ));
   }
   // Error in GetOverlappedResult; handle it.
   dwLastError = GetLastError();
   // Its possible for this error to occur if the
   // service provider has closed the port.  Time to end.
   if (dwLastError == ERROR_INVALID_HANDLE )
      return false;
   // Unexpected error come here. No idea what could cause this to happen.
   PostHangupCall();
   return false;
}// {TReadThread.HandleReadEvent}


//////////////////////////////////////////////////////////
//  函數: HandleReadData(LPCSTR, DWORD)
//
//  目的: Deals with data after its been read from the comm file.
//
//  參數:
//    lpszInputBuffer  - Buffer to place incoming bytes.
//    dwSizeofBuffer   - size of lpszInputBuffer.
//
//  返回值:
//    TRUE if able to successfully handle the data.
//    FALSE if unable to allocate memory or handle the data.
//
//  注釋:
//
//    This function is yet another helper function for the Read Thread.
//    It LocalAlloc()s a buffer, copies the new data to this buffer and
//    calls PostWriteToDisplayCtl to let the EditCtls module deal with
//    the data.  Its assumed that PostWriteToDisplayCtl posts the message
//    rather than dealing with it right away so that the Read Thread
//    is free to get right back to waiting for data.  Its also assumed
//    that the EditCtls module is responsible for LocalFree()ing the
//    pointer that is passed on.
//

bool TReadThread::HandleReadData(LPCSTR lpszInputBuffer, DWORD dwSizeofBuffer)
{
   LPSTR lpszPostedBytes;
//Result = false;
// If we got data and didn't just time out empty...
   if (dwSizeofBuffer != 0 )
   {
      // Do something with the bytes read.
      lpszPostedBytes = (LPSTR)( LocalAlloc( LPTR, dwSizeofBuffer+1 ) );
      if (lpszPostedBytes == NULL )
      {
         // Out of memory        
         PostHangupCall();
         return false;
       }
       strncpy( lpszPostedBytes,lpszInputBuffer,dwSizeofBuffer);
       lpszPostedBytes[dwSizeofBuffer] = '\0';
       return (ReceiveData( lpszPostedBytes, dwSizeofBuffer ));
   }
   return false;
}//{TReadThread.HandleReadData}

bool TReadThread::ReceiveData(LPSTR lpNewString,DWORD dwSizeofNewString)
{
   if (! PostMessage(m_handlemsg,USER_RECEIVEDATA,WPARAM(dwSizeofNewString), LPARAM(lpNewString)))
   {
      PostHangupCall();
      return false;
   }
   return true;
}
   


bool TReadThread::ReceiveError(DWORD EvtMask)
{
   if (! PostMessage(m_handlemsg,USER_RECEIVEDATAERROR, 0, LPARAM(EvtMask) ) )
   {   
      PostHangupCall ();
      return false;
   }
   return true; 
}

void TReadThread::PostHangupCall()
//當讀線程掛起時,觸發掛起線程事件,讓用戶處理它
{            //接收窗體        讀數據時事件掛起標識
   int i=1;
   PostMessage(m_handlemsg,USER_ONCOMMHANGUP, 0, LPARAM(i));
}


IMPLEMENT_DYNAMIC(TWriteThread, CWinThread)
////////////////////////////////////////////////////////
//  過程:  TWriteThread::TWriteThread
//
//  目的: 寫線程的起始點
//
//  參數: 無
//
//  返回值: 無
//
//  注釋:
//
//    寫線程使用消息循環等待要寫入的字符串,當得到后便寫入到串口中。
//    如果收到關閉消息,則關閉退出
//    使用消息的方法使得向串口中寫數據與用戶的操作是不同步的。
/////////////////////////////////////////////////////////////////////////////
TWriteThread::TWriteThread()
{

}

//////////////////////////////////////////////////////////////////
//線程處理實體,當返回FALSE時,表示線程結束
//////////////////////////////////////////////////////////////////
BOOL TWriteThread::InitInstance()
{
   MSG msg;
   DWORD dwHandleSignaled;
   OVERLAPPED overlappedWrite;
   BOOL CompleteOneWriteRequire;
   BOOL contiflag;
   // overlapped 方式的輸入輸出需要下面處理過的結構體.
   memset( &overlappedWrite,0, sizeof(overlappedWrite));
   overlappedWrite.hEvent = CreateEvent( NULL, true, false, NULL );
   //沒有創建適合的事件
   if (overlappedWrite.hEvent == 0 )
   {
      PostHangupCall();
      goto EndWriteThread;
   }
   CompleteOneWriteRequire = false;
   //主循環,直到結束它.
   while (true)
   {      
      contiflag=false;
      if (! PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
      {
         // 如果沒有消息則等待消息產生或者操作被停止
         m_pbSendDataEmpty = true;//此時當然沒有要傳輸的數據
         if (CompleteOneWriteRequire) //一次傳輸完畢告訴用戶
         {
            if (!PostMessage(m_handlemsg,USER_DATASENDFINISHED, 0, 0 ) )
            {
               PostHangupCall();
               goto EndWriteThread;
            }
         }
         CompleteOneWriteRequire = false;
         dwHandleSignaled = MsgWaitForMultipleObjects(1, &m_hCloseEvent, false,
                                                       INFINITE, QS_ALLINPUT);
         switch (dwHandleSignaled)
         {
         case WAIT_OBJECT_0:     // 關閉消息!
               // 退出.
               goto EndWriteThread;
               break; 
         case WAIT_OBJECT_0 + 1: // 得到新的消息.
               // 重新循環來處理它.
               contiflag =true;
               break;
         case WAIT_FAILED:       // 超時,不可能出現.
               PostHangupCall();
               goto EndWriteThread;
               break;
         default:                // 不可能出現.
               PostHangupCall();
               goto EndWriteThread;
         }
         if (contiflag) continue;
      }
	   else
	   {
         // 確認在接收數據時是否有關閉消息產生
         if (WAIT_TIMEOUT != WaitForSingleObject(m_hCloseEvent,0) )
            goto EndWriteThread;
         // 處理該條消息,如果此時有對話框出現則下面語句可做范例.
         //本控件用不到
         if (msg.hwnd != NULL )
         {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
            continue;
         }

         // 處理得到的消息.
         switch ( msg.message )
         {
         case USER_WRITEPORT:  // 向串口中寫入字符串.
            // 向串口中寫入字符串.  HandleWriteData
            // 直到寫完數據后才返回,
            // 除非出現錯誤或者端口被關閉.
            if (! HandleWriteData( &overlappedWrite,
                                    (char*)(msg.lParam), DWORD(msg.wParam) ) )
            {
               // 將得到的消息結構體釋放
               LocalFree( HLOCAL(msg.lParam) );
               goto EndWriteThread;
            }
			
            CompleteOneWriteRequire = true;//成功完成一次寫操作
            // 將寫入到消息結構體中的數據空間清空.
            LocalFree( HLOCAL(msg.lParam) );
         }
      }
   } //{main loop}
   //結束寫線程.
EndWriteThread:
   PurgeComm(m_hCommFile, PURGE_TXABORT + PURGE_TXCLEAR);
   m_pbSendDataEmpty = true;
   CloseHandle(overlappedWrite.hEvent);
   return false;
}//{TWriteThread.Execute}


////////////////////////////////////////////////////////
//  函數: HandleWriteData(LPOVERLAPPED, LPCSTR, DWORD)
//
//  目的: 向串口文件寫入字符串.
//
//  參數:
//    lpOverlappedWrite      - WriteFile函數中使用的LPOVERLAPPED結構體
//    pDataToWrite           - 需要寫入的字符串.
//    dwNumberOfBytesToWrite - 字符串的長度.
//
//  返回值:
//    當所有字節都寫完時返回真值(非零). 否則返回假值(零)
//
//  注釋:
//
//    該函數是寫線程的輔助函數,它實際向串口寫數據.
//    注意該調用將阻塞直到寫線程結束寫操作,或者收到結束線程的消息.
//    返回假值時可能的原因是串口被服務提供者關閉
//
bool TWriteThread::HandleWriteData(OVERLAPPED* lpOverlappedWrite,LPSTR pDataToWrite, DWORD dwNumberOfBytesToWrite)
{
   DWORD dwLastError;
   DWORD dwNumberOfBytesWritten,dwWhereToStartWriting,dwHandleSignaled;
   HANDLE HandlesToWaitFor[2];
   //Result = false;//缺省返回值
   dwNumberOfBytesWritten = 0;//已經寫的字符為零
   dwWhereToStartWriting = 0; // 從字符串的開始位置寫字符串.
   //記錄兩個事件
   HandlesToWaitFor[0] = m_hCloseEvent;//關閉事件句柄
   HandlesToWaitFor[1] = lpOverlappedWrite->hEvent;
   // 循環,直到將字符寫完.
   do
   {
   // 開始進行輸入/輸出.
      if (! WriteFile( m_hCommFile,//串口文件句柄
                       &(pDataToWrite[ dwWhereToStartWriting ]),//每次接著傳輸剩下的字符串
                       dwNumberOfBytesToWrite, &dwNumberOfBytesWritten,
                       lpOverlappedWrite ) )
      {
         //如果寫操作失敗,則下面要得到錯誤句柄.
         dwLastError = GetLastError();
         // 如果服務提供者關閉了串口或者超時,則將出現下面的錯誤
         if (dwLastError == ERROR_INVALID_HANDLE)   return false;
         //不可知的錯誤.
         if (dwLastError != ERROR_IO_PENDING )
         {
            PostHangupCall();//調用用戶的相應事件處理程序
            return false;
         };
         // 下面是可以處理的情況.有時沒有等待寫完數據便返回FALSE
         // 等待寫過程結束或者收到了停止信號。
         dwHandleSignaled = WaitForMultipleObjects(2, HandlesToWaitFor,
                             false, INFINITE);

         switch ( dwHandleSignaled )
         {
         case  WAIT_OBJECT_0:     // 收到了關閉消息!
               // 退出.
               return false;

         case WAIT_OBJECT_0 + 1: // 寫操作完畢.            
            // 得到寫操作的結果
            if (! GetOverlappedResult(m_hCommFile,
                                     lpOverlappedWrite,
                                     &dwNumberOfBytesWritten, true) )
            {
               dwLastError = GetLastError();
               // 當服務提供者關閉端口時將出現下面的錯誤
               if (dwLastError == ERROR_INVALID_HANDLE)  return false;
               // 其它情況不再做特殊處理,直接退出.
               PostHangupCall();
               return false;
            }            
            break;
         case WAIT_FAILED: // 等待超時,由于參數為真值,所以不可能出現.
            PostHangupCall();
            return false;
         default: // 所以不可能出現.
            PostHangupCall();
            return false;
         }
      }
      //{處理了寫操作失敗的情況}
      // 記錄寫過的數據數和剩下的字節數.
      dwNumberOfBytesToWrite -= dwNumberOfBytesWritten; //減
      dwWhereToStartWriting+=dwNumberOfBytesWritten ;//加
   } while (dwNumberOfBytesToWrite > 0);  // 直到寫完為止!
   // 寫完畢后返回真.
   return true;
}//{TWriteThread.HandleWriteData}

void TWriteThread::PostHangupCall()
//當寫線程掛起時,觸發掛起線程事件,讓用戶處理它
{            //接收窗體        寫數據時事件掛起標識
   int i=0;
   PostMessage(m_handlemsg,USER_ONCOMMHANGUP, 0, LPARAM(i));
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
青青草国产成人99久久| 国产农村妇女毛片精品久久麻豆| 亚洲素人一区二区| 色婷婷精品大在线视频| 一区二区三区四区在线免费观看| 91高清视频免费看| 午夜欧美电影在线观看| 日韩免费性生活视频播放| 九九在线精品视频| 国产精品污www在线观看| av亚洲产国偷v产偷v自拍| 中文字幕中文乱码欧美一区二区| 在线这里只有精品| 奇米精品一区二区三区在线观看一 | 国产精品66部| 国产精品传媒在线| 欧美日韩国产成人在线免费| 免费在线观看一区二区三区| 国产欧美久久久精品影院| 在线一区二区视频| 国产毛片精品国产一区二区三区| 亚洲人精品午夜| 日韩亚洲国产中文字幕欧美| 成人综合在线网站| 午夜视频久久久久久| 国产欧美综合在线| 欧美人与性动xxxx| 国产91精品一区二区麻豆亚洲| 玉米视频成人免费看| 精品黑人一区二区三区久久| av资源网一区| 免费人成在线不卡| 亚洲另类在线制服丝袜| 精品国产乱码久久久久久夜甘婷婷| 99精品一区二区| 久久国内精品视频| 狂野欧美性猛交blacked| 国产精品久久久99| 日韩欧美你懂的| 在线观看一区日韩| 国产高清亚洲一区| 秋霞电影一区二区| 一区二区三区加勒比av| 久久毛片高清国产| 欧美一区二区三区四区高清| 91在线观看一区二区| 捆绑变态av一区二区三区| 亚洲一区精品在线| 国产精品久久久久三级| 日韩久久免费av| 欧美日韩卡一卡二| 日本韩国欧美国产| 成人高清视频在线观看| 麻豆91精品视频| 亚洲成年人影院| 日韩久久一区二区| 国产精品乱码人人做人人爱| 欧美va亚洲va| 欧美一级片在线| 欧美日韩国产在线播放网站| 色欧美乱欧美15图片| www.久久精品| www.色综合.com| 成人午夜电影久久影院| 国产在线精品一区在线观看麻豆| 视频一区在线视频| 午夜久久电影网| 三级一区在线视频先锋| 午夜精彩视频在线观看不卡| 亚洲综合丝袜美腿| 亚洲一区二区中文在线| 亚洲综合激情小说| 亚洲网友自拍偷拍| 亚洲国产日韩精品| 日韩在线卡一卡二| 日韩va亚洲va欧美va久久| 日韩成人午夜电影| 蜜臀va亚洲va欧美va天堂| 日韩综合小视频| 老汉av免费一区二区三区| 激情六月婷婷久久| 国产成人亚洲综合a∨婷婷图片| 国产精品一色哟哟哟| 国产精品系列在线播放| 国产成人精品www牛牛影视| 成人综合在线观看| 色婷婷av一区二区三区大白胸| 色综合久久中文综合久久牛| 欧美视频中文字幕| 91精品国产91久久综合桃花| 日韩精品专区在线影院重磅| 精品少妇一区二区三区| 国产日韩三级在线| 亚洲女人****多毛耸耸8| 亚洲一卡二卡三卡四卡五卡| 日韩中文字幕区一区有砖一区| 日韩电影在线观看一区| 国产乱人伦偷精品视频免下载| 高清av一区二区| 日本国产一区二区| 日韩一区二区视频在线观看| 精品国产精品一区二区夜夜嗨| 麻豆国产91在线播放| 国产一区欧美二区| 99久久久无码国产精品| 91精品国产综合久久蜜臀| 久久久亚洲精品石原莉奈 | 99久久精品情趣| 欧美日韩激情一区| 欧美不卡一二三| 亚洲视频在线一区二区| 青青草精品视频| a在线欧美一区| 日韩视频在线观看一区二区| 国产视频911| 视频在线观看国产精品| 成人黄页毛片网站| 7799精品视频| 中文字幕亚洲一区二区va在线| 午夜影院在线观看欧美| 成人黄色一级视频| 91精品黄色片免费大全| 成人免费在线播放视频| 久久国产精品一区二区| 色综合婷婷久久| 亚洲精品久久久久久国产精华液| 亚洲一区二区欧美| 粉嫩一区二区三区性色av| 欧美日韩大陆一区二区| 国产精品毛片高清在线完整版| 五月天视频一区| 91丨九色丨尤物| 久久嫩草精品久久久精品一| 亚洲一区二区三区美女| 国产成人在线免费| 精品国产一区二区亚洲人成毛片| 洋洋av久久久久久久一区| 丰满放荡岳乱妇91ww| 日韩欧美国产精品| 亚洲成人1区2区| 在线看国产一区| 国产精品成人在线观看| 国产麻豆成人精品| 日韩欧美一区二区免费| 亚洲国产wwwccc36天堂| 97精品电影院| 国产精品情趣视频| 国产原创一区二区| 日韩一级片在线播放| 婷婷综合在线观看| 欧美日韩1234| 亚洲成人综合在线| 欧美综合天天夜夜久久| 亚洲视频一二三区| 91在线播放网址| 亚洲欧美日韩一区| 91在线视频18| 亚洲欧美区自拍先锋| kk眼镜猥琐国模调教系列一区二区 | 国产激情偷乱视频一区二区三区| 91麻豆精品国产91久久久资源速度 | 日韩一区二区免费视频| 舔着乳尖日韩一区| 欧美日本韩国一区| 亚洲成人免费在线观看| 欧美日韩你懂得| 丝袜美腿成人在线| 欧美日本国产一区| 日韩电影在线观看电影| 日韩欧美精品在线| 久久国产剧场电影| 国产拍揄自揄精品视频麻豆| 国产·精品毛片| 国产精品久久久久久久久免费丝袜| 成人午夜电影久久影院| 成人欧美一区二区三区视频网页| 99视频热这里只有精品免费| 亚洲欧美色图小说| 欧洲一区二区三区免费视频| 亚洲成人久久影院| 欧美一区二区免费视频| 韩国女主播一区二区三区| 国产亚洲欧美激情| 成人a免费在线看| 一个色在线综合| 日韩欧美黄色影院| 成人小视频免费观看| 亚洲欧美电影一区二区| 欧美天堂一区二区三区| 三级不卡在线观看| 国产亚洲成aⅴ人片在线观看| 国产福利91精品一区二区三区| 亚洲欧洲成人av每日更新| 欧美三级视频在线| 极品销魂美女一区二区三区| 国产精品素人一区二区| 欧美午夜精品一区二区蜜桃| 日韩国产高清在线| 国产精品国产三级国产三级人妇| 欧美视频三区在线播放|