大家好,我在用VC做一個上位機資料決議軟體,上位機使用LIBUSB 來接收下位機傳輸的資料,我在LIBUSB讀執行緒里面決議資料,這些資料都有固定的格式 一幀一幀傳上來的,決議之后我再把這些資料填充進LISTCTR里面,LISTCTRL 第一列是變數名,大概有30個變數左右,后面是該變數的內容,變數內容不時的重繪,填充資料項都是用m_listctrl.SetItemText() 這個函式進行填充,現在發現在我的筆記本上當幀率超過800時,整個程式變的很慢,有些幀已經顯示的不對,在臺式機上幀率超過1400,程式已經反映很慢,點擊程式上的一些BUTTON 要很久才反應過來,此時在任務管理器里面看該程式的CPU占用率 基本上已經到了百分之30左右,我也試過ListCTRL的虛擬串列,改善不明顯,感覺是重繪太快,LISTCTRL 填充耗費了大量的時間,不知道各位論壇的大神們有沒有好點方法來處理這個問題,關鍵就是怎么讓LISTCTRL 填充時間減短,或者還有沒有其他更好的控制元件來處理此類問題?
uj5u.com熱心網友回復:
如果你在執行緒里直接調m_listctrl.SetItemText()
想不卡都不行,因為你沒有留時間片區回應其它訊息了.
Threadfunction
{
Sleep(10); //一定要睡眠一下自己,分點時間片給主執行緒;
}
而且還有一個問題,m_listctrl插入那么多資料,實際上用戶只看一部分資料的。也就是說你可以實際上把接收的資料存下來,等用戶翻查的時候顯示一個page,不用一下插入1400條吧,有點嚇人。而且體驗也不好吧。
改成14 *100 或者 28 * 50 不是更好嗎? 每次只顯示一部分
uj5u.com熱心網友回復:
你如果資料量大,就不應該全部顯示,分頁等,每次只更新一頁的資料,來降低性能損耗uj5u.com熱心網友回復:
實際上 這個串列一共也就30多行,一頁就能全部顯示,只是每一行的資料在不停的變化,我要實時觀察這些資料,并不是要分頁查看,我是在LIBUSB 讀執行緒里填充,只是LIBUSB 不停的在收資料,不然LIBUSB讀執行緒應該是能阻塞的,感覺如果像tajon1226 說的,在延遲10ms,恐怕實時性會更差,不知道我的理解對不對?uj5u.com熱心網友回復:
1 資料做快取, 更新前比較下, 如果相同就跳過2 定時快照重繪, 太高的重繪率 對人眼沒有意義
uj5u.com熱心網友回復:
m_list.SetRedraw(FALSE);//增加內容
XXXX
//更新內容
m_list.SetRedraw(TRUE);
uj5u.com熱心網友回復:
重繪太快沒什么意義,所有資料全部收集齊了,通知視窗從記憶體重繪ListCtrluj5u.com熱心網友回復:
這個不是什么加速不加速的問題。應該另開一個執行緒專門用來接收資料。主執行緒僅僅用于顯示資料。按這樣的方法,想卡都難
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/108158.html
標籤:基礎類
下一篇:解決VS2013 2個錯誤
