我的mfc界面有很多控制元件需要重繪,而且很頻繁,造成程式卡頓,想使用執行緒優化界面。
如圖1,是我的界面的一部分,圖2是串口接收資料,圖3是串口資料的決議。界面重繪是通過一個類似圖3的一個函式實作的
void CTestselfDlg::DlgAutoCheck(BYTE * ReceiveData, bool reset)
我想使用執行緒專門處理資料和界面,但是嘗試了很多網上的辦法也沒有實作。求指點!!!


uj5u.com熱心網友回復:
首先你應該在執行緒中接收處理串口資料,不要用mscomm這個控制元件,改用其他串口類。 執行緒中處理完需要重繪顯示時,發送訊息讓視窗重繪。主視窗頻繁重繪這些控制元件應該沒壓力了。
uj5u.com熱心網友回復:
那我應該用哪個類比較好?
uj5u.com熱心網友回復:
CSerialPort,CnComm。 我個人用的一直是CnComm。uj5u.com熱心網友回復:
你可以先找出瓶頸在哪里(未必是在界面重繪,100多個復選框,我認為操作起來并不會出現非常明顯的延遲),你可以寫一個測驗代碼,不從ReceiveData拿資料,設定一輪所有的控制元件,看用時多久;
然后再測驗一下你的實際代碼,中間相差時間很多的話,肯定就是ReceiveData太慢了;
如果確實是ReceiveData的問題,那么你可以:
A、單獨一個執行緒建立顯示視窗,并設定控制元件狀態;另一個執行緒只管ReceiveData,并把收到的資料PostMessage給UI執行緒,這樣不會打斷重繪UI的程序;
B、減少接收資料的時間開銷,由于我很少用這個MSComm所以不確定是否支持以下操作:
1、以非阻塞模式讀取串口,還可以將串口完成事件關聯到IOCP(更復雜的編程模型,你發出異步的請求后,程式可繼續往下走,作業系統會通知你操作完成);
2、可以考慮狀態在發送方組合成一個整體的資料塊。一次收發一批傳感器的狀態。
串口操作庫推薦http://www.naughter.com/serialport.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/238772.html
標籤:進程/線程/DLL
