上周開始把之前做的一個監控程序追加功能。
功能不難,其實主要就是
先取得數據,
界面顯示,
然后啟動監視線程,
有變化,更新之。
簡單記錄一下每一部分的實現方法。
取得數據:
先從一堆文件中,搜索需要的值,并把值相關的內容放入數組。這里需要一個動態數組。插入的時候自動排序,在內存中排序之后的數組即可在ListView中顯示,并存成csv文件,再次取得數據優先從csv文件中讀取,提高速度。
數據的存放方式為csv文件。本來想用CStdioFile,無奈CE下面沒提供這個類,遂自己做了CCsvFile,主要功能跟CStdioFile一樣,可以實現按行讀寫文件。讀出來的東東為“0,abc,def,’中國人’”等等,再小分析一下字符串就OK了。
顯示為ListView:
這個CListView需要在第三列,第四列畫上Button,同時由于ListView中數據跟我的動態數組中的數據為映射關系,隧共享一份內存顯示就好了。
在CListView中畫Button花了點功夫。考慮到效率不想Create很多Button,決定自繪,做一個CListViewBtn,重載NM_CUSTOMDRAW,在里面DrawFrameControl。當然還要重載消息ON_WM_LBUTTONDOWN, ON_WM_LBUTTONUP。
共享內存部分很簡單,InsertItem時候將LV_ITEM的pszText設置為LPSTR_TEXTCALLBACK,lParam指針指向要共享的內存數據,重載LVN_GETDISPINFO。咔咔兩下就能解決問題。
啟動線程:
使用MFC的CWinThread,AfxBeginThread啟動一個ThreadFunc,在ThreadFunc中使用While循環檢查設備值是否更改。
While循環
{
檢查退出信號量
檢查設備值是否更改,更改了:PostMessage
沒更改:Looop
}
雖然是說起來如此簡單的工作,還是花費了大概4天的時間去完成代碼。