WinCE7?+?Telechips?8935,通過串口輸出?LOG?時,可能是由于多個應(yīng)用同時使用串口輸出?LOG,會出現(xiàn)?LOG?混亂的情況。
出現(xiàn)這種情況后,LOG?完全是亂的,根本沒有辦法看。?修改的方法是:將?LOG?寫入?U?盤中,形成一個文件。
寫文件的操作很簡單,但如何將?RETAILMSG?的格式轉(zhuǎn)成字符串呢?
但由于我負(fù)責(zé)這個應(yīng)用是主控,負(fù)責(zé)各個應(yīng)用之間的調(diào)度,寫的過程中增加了很多?RETAILMSG?和?printf?的?LOG?輸出以方便分析問題,統(tǒng)計了一下大概有?800?個左右,大多數(shù)是?RETAILMSG。
如果需要一個個修改,我只能考慮放棄。考慮到?RETAILMSG?是一個宏定義,能否通過一個自定義的、類似的宏代替它,這樣對源代碼的修改就可以盡可能的少。
先是實現(xiàn)了一個如下定義的宏:RETMSG,可以完成將?RETAILMSG?后的變參格式轉(zhuǎn)成字符串。簡單的測試后,發(fā)現(xiàn)可以達到想要的功能。
#ifndef?_RET_MSG_H_ #define?_RET_MSG_H_ #include?"atlstr.h" #define?LOG_FILE_PATH L"/hard?disk" #define?LOG_FILE_NAME L"/hard?disk/logFileName.dat" #define?MAX_UNICODE_LEN 2048 void?InitWriteFileCs(void); void?DeleteWriteFileCs(void); void?WriteAnsiDataToFile(const?char?*pcDataBuf); #define?RETMSG(cond,printf_exp) {? CString?csDataBuf;? char?cTmpBuf[2?*?MAX_UNICODE_LEN?+?1];? csDataBuf.Format?printf_exp;? WriteAnsiDataToFile(csDataBuf);? } #endif
但是由于我的應(yīng)用沒有使用?MFC,雖然整合編譯通過,但是運行時報錯了。只要執(zhí)行這句:csDataBuf.Format?printf_exp;?就會有異常的信息輸出。
出錯的原因,偶只是懷疑與多線程相關(guān)(因為在簡單的?MFC?對應(yīng)框中測試是可以正常使用的)。因為偶的應(yīng)用中有多個線程,每個線程之間異步運行。
不能使用?CString,讓我頭痛了一段時間。沒有關(guān)系,關(guān)鍵是我想找一個與?CString.Format?相同參數(shù)的格式化字符串的函數(shù)。
但是沒有!?看來想通過簡單的方法是不行了,開始考慮使用?wsprintf/sprintf?函數(shù)。
如何將這兩個函數(shù)?wsprintf/sprintf?的第一個參數(shù)代入?wsprintf/sprintf?printf_exp?中?
后來實在沒有辦法,只能將?wsprintf/sprintf?的第一個參數(shù)寫在?RETMSG?的調(diào)用中,如:
RETMSG(1,(gtcRetMsgBuf,L"[MP]show?UI,show?page?id:?0x%x?failed!!!rn",pageid));
這樣就可以得到類似的語句:
wsprintf(gtcRetMsgBuf,L"[MP]show?UI,show?page?id:?0x%x?failed!!!rn",pageid);
從而完成字符串格式的功能。
同樣,完成替代?printf?的宏定義。
#ifndef?_RET_MSG_H_ #define?_RET_MSG_H_ #define?LOG_FILE_PATH L"/hard?disk" #define?LOG_FILE_NAME L"/hard?disk/logFileName.dat" #define?MAX_UNICODE_LEN (2048?+?1) void?WriteAnsiDataToFile(const?char?*pcDataBuf); void?WriteUnicodeDataToFile(TCHAR?*ptcDataBuf); extern?TCHAR?gtcRetMsgBuf[]; extern?char?gcRetMsgBuf[]; #define?RETMSG(cond,printf_exp) {? if(cond)? {? ZeroMemory(gtcRetMsgBuf,sizeof(TCHAR)?*?MAX_UNICODE_LEN);? wsprintf?printf_exp;? WriteUnicodeDataToFile(gtcRetMsgBuf);? }? } #define?RETMSG_printf(printf_exp)? {? ZeroMemory(gcRetMsgBuf,sizeof(char)?*?MAX_UNICODE_LEN);? sprintf?printf_exp;? WriteAnsiDataToFile(gcRetMsgBuf);? }? #endif
多線程時,引功能需要增加了臨界區(qū),否則會出現(xiàn) LOG 被覆蓋的問題。
再考慮到剛啟動時 U 盤的識別可能慢,所以后續(xù)增加了緩沖的功能......
想要完善一個功能,真是不容易??!