Re: [問題]利用多執行緒持續讀取commport資料的問題(MFC)
※ 引述《timohu ( )》之銘言:
: 我的MFC程式架構是持續的進行WriteFile()然後ReadFile()
: 再主程式的地方開啟COMMPORT
: 然後在新增一直接收的執行序hThread = CreateThread(.......
: 程式啟動後就會一直讀取資料,更新視窗上text的值
: 但是當我要按下視窗上的button做其他動作,
: 或是切換視窗上的tab control觀察其他數據時
: 視窗會卡住(因為持續在讀取資料)
: 甚至原本我有設計一個timer讓某個picture持續轉動也會卡住
問題還是找不到原因...
程式架構是
我在開啟commport後
(m_hComm = CreateFile(COMstr,GENERIC_READ|GENERIC_WRITE,0,0,.......)
create一個執行序:
hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) CommThread,
0,
0,
&dwThreadId);
內容如下:
DWORD CommThread()
{
while(bReading)
{
WaitCommEvent(m_hComm, &dwMask, 0);
if(dwMask & EV_RXCHAR)
{
ClearCommError (m_hComm, &dwError, &cs);
nToRead=cs.cbInQue;
if(nToRead==0) continue;
if(nToRead>=nBytesRead)
{
ClearCommError (m_hComm, &dwError, &cs);
ReadFile(m_hComm, inbuff, nToRead, &nBytesRead, &o);
ReceiveCnt1=nBytesRead;
nToRead=0;
ComTimeOutFlag=false;
}
}
}
PurgeComm(m_hComm, PURGE_RXCLEAR);
return 0L;
}
主程式會一直對設備進行資料的讀取(writefile, 然後在CommThread裡面readfile)
現在我的LOOP已經可以正確執行,持續更新資料
但是也因為持續在讀取資料,所以視窗上其他功能都不能執行了
ex:原本為了美觀用timer讓一個picture的圖形旋轉不動了
、視窗上想選擇tab上不同頁面觀察各種資料也沒反應
、按下一些按鈕要讓讀取資料的LOOP做其他改變也沒反應
下面是我WriteFile()之後的程式:
WaitResponse();//等待資料接收
if(ComTimeOutFlag)
AfxMessageBox("connection error!!");
Process_Rx_Data();//處理接收到的資料
等待資料副程式
void CGUIDlg::WaitResponse()
{
int tt;
tt=1;
ComTimeOutFlag=true;
bReading = true;
ReceiveCnt1=0;
time_t t1=time(NULL);
time_t t2;
do{
t2=time(NULL);
if(!ComTimeOutFlag) break;
}while(t2-t1<=tt);
}
不知道這樣有人看的懂嗎?
很怕弄半天是我搞錯了多執行緒的觀念
或是我這樣做根本就不是在多執行緒@_@
--
VB學一學直接跳MFC也快一年了
還是VB可愛許多...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.212.154
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章