普通接收函數的改進(時間片->線程實現)

最最開始,我的數據接收是用wxwi中的定時器定時讀取來實現的,定時器中函數如下:

void SComtestFrame::OnTimer1Trigger(wxTimerEvent& event)
{
    static DWORD number;
    static DWORD i;
    if((number=serialPort->read_t(receiveBuf))>0)
    {

           if(hexflag)
            {
                for(i=0;i<number;i++)
                *TextCtrl1<<wxString::Format("%d",(unsigned char)receiveBuf[i])<<" ";
            }
            else
            *TextCtrl1<<receiveBuf;
            readed+=number;
            StatusBar1->SetStatusText(wxString::Format("%i",readed),1);
            delete[] receiveBuf;
    }
}

這其中附帶將數據顯示在wxtextctrl中的處理,那個hexflag實際上是十進制顯示。。。我當時找了一頓竟然發現不能簡單的將char*指向的存儲區的數值直接顯示出來,所以用了這麼個笨辦法。

read_t函數如下:

DWORD mySerialPort::read_t(char*& readbuf)
    {

        if(num=GetCacheByteNum())//是否有數據
        {
            if(num<0x100000)//大於1M?
            {
                readbuf=new char[num+5];//分配空間
                readedBytes=Read(readbuf,num);
                readbuf[readedBytes]=0;//添加結束符
                return readedBytes;
            }
            else return -1;
        }
        return 0;
    }

這種處理是每次讀緩衝區所有數據並顯示,但是接收高波特率,大量數據時會很容易沒響應,也許把時間間隔設一點會好一些,但這樣仍然阻塞了主線程,所以我決定還是將通信部分挪到單獨線程去,主線程只負責圖形界面顯示與用戶交互等。


我決定先去把圖片顯示出來再說。。。未完待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章