亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? stlogfile.h

?? windows ce開發技巧與實例光盤代碼
?? H
?? 第 1 頁 / 共 2 頁
字號:
				::SetFilePointer(m_hFile, 0, 0, FILE_END);
				m_bIsStarted = TRUE;
				TCHAR szExecutable[MAX_PATH];
				GetModuleFileName(NULL, szExecutable, MAX_PATH);
				DWORD dwProcID = GetCurrentProcessId();
				SYSTEMTIME st;
				GetLocalTime(&st);
				Write(TEXT("============================================="));
				Write(TEXT("Log is started on %02u.%02u.%04u, at %02u:%02u:%02u:%03u, executable: %s (ProcID: 0x%08x), compile time : %s %s"), st.wDay, st.wMonth, st.wYear, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, szExecutable, dwProcID, TEXT(__DATE__) , TEXT(__TIME__));
			}
			::LeaveCriticalSection(&m_crit);
		}

		void Stop() 
		{
			::EnterCriticalSection(&m_crit);
			DeleteStaticCounters();
			if (m_bIsStarted) {
				Write(TEXT("Log finished"));
		//		::CloseHandle(m_hFile);
				m_bIsStarted = FALSE;
			}
			::LeaveCriticalSection(&m_crit);
		}
	protected:
		CSTLogFile() 
			: m_bIsStarted(FALSE), nLastCounter(0)
		{
			::InitializeCriticalSection(&m_crit);
#ifdef STLOG_USE_PERFORMANCE_COUNTER
			::QueryPerformanceFrequency(&m_nPerfFreq);
			::QueryPerformanceCounter(&m_nStartTime);
#endif 
		}
	public:
		virtual ~CSTLogFile() 
		{
			if (m_bIsStarted)
				Stop();
			::DeleteCriticalSection(&m_crit);
		}

	private:
		HANDLE m_hFile;
		CRITICAL_SECTION m_crit;
		BOOL m_bIsStarted;


	#ifdef STLOG_USE_PERFORMANCE_COUNTER
		LARGE_INTEGER m_nPerfFreq;
		LARGE_INTEGER m_nStartTime;
	#endif

		BOOL GetTimeString(LPSTR szString, int nStringSize) 
		{
			SYSTEMTIME st;
			GetLocalTime(&st);
			return (0 < _snprintf(szString, nStringSize, "%02u:%02u:%02u:%03u", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds));
		}

		void GetLogFileName(LPTSTR szFileName) {
			TCHAR wszExecutableFilePath[MAX_PATH];
			::GetModuleFileName(NULL, wszExecutableFilePath, MAX_PATH);
#ifdef STLOG_CREATE_FILE_IN_THE_SAME_DIRECTORY
			TCHAR *wszExecutableFileName = wszExecutableFilePath;
#else
			TCHAR *wszExecutableFileName = ::_tcsrchr(wszExecutableFilePath, _T('\\'));
#endif

			TCHAR *wszLastDot = ::_tcsrchr(wszExecutableFileName, _T('.'));
#ifdef STLOG_CREATE_NEW
			BOOL bFound = FALSE;
			int nFreeNumber = 0;
			WCHAR wszTemp[10];

			while (!bFound) {

				swprintf(wszTemp, _T("%02d_log.log"), nFreeNumber);
				::_tcscpy(wszLastDot, wszTemp);
				if (0xFFFFFFFF == ::GetFileAttributes(wszExecutableFileName))
				{
					bFound = TRUE;
				} else {
					nFreeNumber++;
				}
			}

#else 
			::_tcscpy(wszLastDot, _T("_log.txt"));
#endif 
			::_tcscpy(szFileName, wszExecutableFileName);
		}
	public:
		
		class Counter{
		public:
			Counter(char *szFile, int nLine) : m_nCounter(0), m_szFile(szFile), m_nLine(nLine)
			{
				m_nCounterIndex = ___g_nCounterIndex___++;
				::InitializeCriticalSection(&m_crit);
				CSTLogFile::GetLogFile()->Write("***Counter %d at %s,%d initialized", m_nCounterIndex, szFile, nLine);
				m_TotalTime.QuadPart = 0;
			}
			~Counter()	
			{
				CSTLogFile::GetLogFile()->Write("Counter %d statistics\r\n\tCounts: %d,\r\n\tMinTime: %I64d ms,\r\n\tMaxTime: %I64d ms,\r\n\tTotalTime: %I64d ms,\r\n\tAverageTime: %I64d ms", 
					m_nCounterIndex, m_nCounter, m_MinTime.QuadPart, m_MaxTime.QuadPart, m_TotalTime.QuadPart, m_TotalTime.QuadPart / m_nCounter); 
				::DeleteCriticalSection(&m_crit);
			}
			void StartSection() 
			{	
				::EnterCriticalSection(&m_crit);
				m_nCounter++;
				CSTLogFile::GetLogFile()->Write("Counter %d started", m_nCounterIndex); 
				::QueryPerformanceCounter(&m_StartTime);
				m_LastCheckPoint.QuadPart = m_StartTime.QuadPart;
				::LeaveCriticalSection(&m_crit);
			}
			void StopSection() 
			{
				::EnterCriticalSection(&m_crit);
				LARGE_INTEGER liCurrentTime;
				::QueryPerformanceCounter(&liCurrentTime);
				CSTLogFile::GetLogFile()->Write("Counter %d stopped %I64dms from start, %I64dms from last checkpoint", m_nCounterIndex,  liCurrentTime.QuadPart - m_StartTime.QuadPart, liCurrentTime.QuadPart - m_LastCheckPoint.QuadPart); 
				liCurrentTime.QuadPart -= m_StartTime.QuadPart;
				if (m_nCounter == 1 || m_MinTime.QuadPart > liCurrentTime.QuadPart) m_MinTime.QuadPart = liCurrentTime.QuadPart;
				if (m_nCounter == 1 || m_MaxTime.QuadPart < liCurrentTime.QuadPart) m_MaxTime.QuadPart = liCurrentTime.QuadPart;
				m_TotalTime.QuadPart += liCurrentTime.QuadPart;


				::LeaveCriticalSection(&m_crit);
			}
			void CheckPoint(int nLine) 
			{
				::EnterCriticalSection(&m_crit);
				LARGE_INTEGER liCheckPoint; ::QueryPerformanceCounter(&liCheckPoint);
				CSTLogFile::GetLogFile()->Write("Counter %d check point at line %d: %I64d ms from start, %I64dms from last checkpoint", m_nCounterIndex,  nLine, GetTimeFromStart(), liCheckPoint.QuadPart - m_LastCheckPoint.QuadPart); 
				m_LastCheckPoint.QuadPart = liCheckPoint.QuadPart;
				::LeaveCriticalSection(&m_crit);
			}
			LARGE_INTEGER GetTimeFromStart() 
			{
				LARGE_INTEGER liCurrentTime;
				::QueryPerformanceCounter(&liCurrentTime);
				liCurrentTime.QuadPart -= m_StartTime.QuadPart;
				return liCurrentTime;
			}

		private:
			LARGE_INTEGER m_StartTime;
			LARGE_INTEGER m_MaxTime;
			LARGE_INTEGER m_MinTime;
			LARGE_INTEGER m_TotalTime;
			LARGE_INTEGER m_LastCheckPoint;
			int m_nCounter;
			CRITICAL_SECTION m_crit;
			friend class CounterAux;
			char *m_szFile;
			int m_nLine;
			int m_nCounterIndex ;
		};
		struct CounterAux
		{
			CounterAux(Counter *pCounter) : m_pCounter(pCounter) { if (pCounter) pCounter->StartSection();}
			~CounterAux() { if (m_pCounter) m_pCounter->StopSection();}
			Counter *m_pCounter;
		};

		Counter *m_counters[STLOG_MAXCOUNTERS];
		int nLastCounter;
		static Counter *GetStaticCounter(char *szFile, int nLine) 
		{
			CSTLogFile* pLogFile = GetLogFile();
			if (pLogFile->nLastCounter == STLOG_MAXCOUNTERS)
			{
				pLogFile->Write("*****Max counters (%d) reached, the counter at %s, %d will not be created", STLOG_MAXCOUNTERS, szFile, nLine);
				return 0;
			}


			Counter *p = new Counter(szFile, nLine);
			pLogFile->m_counters[pLogFile->nLastCounter++] = p;
			return p;
		}

		void DeleteStaticCounters()
		{
			while (nLastCounter)
			{
				delete m_counters[--nLastCounter];
			}
		}
		struct Marker 
		{
			Marker(LPCSTR szEntry)
			{
				m_bWide = FALSE;
				m_szEntry = szEntry;
				CSTLogFile::GetLogFile()->Write(">>[%s]", m_szEntry);	
			}
			Marker(LPCWSTR szEntry)
			{
				m_bWide = TRUE;
				m_szEntry = (LPCSTR) szEntry;
				CSTLogFile::GetLogFile()->Write(L">>[%s]", m_szEntry);
			}
			~Marker()
			{
				if (m_bWide)
					CSTLogFile::GetLogFile()->Write(_T("<<[%s]"), (LPCWSTR)m_szEntry);
				else
					CSTLogFile::GetLogFile()->Write(_T("<<[%s]"), m_szEntry);

			}
		private:
			LPCSTR m_szEntry;
			BOOL m_bWide;
		};

	};

#endif

#ifdef STLOG_DEBUG 
	extern CSTLogFile logfile;

	#ifdef STLOG_PRINT_COMPILE_INFO
	#define STLOG_EXPAND_INFO(file, line) \
		CURRENT_FILE = file;	CURRENT_LINE=line;
	#else
		inline void _______DoNothing0() {};
		#define STLOG_EXPAND_INFO(file, line) \
			1 ? void(0) : _______DoNothing0();
	#endif

	#define STLOG_WRITE \
		STLOG_EXPAND_INFO(__FILE__, __LINE__)\
		CSTLogFile::GetLogFile()->Write

	#define STLOG_WRITE_DATA	\
		STLOG_EXPAND_INFO(__FILE__, __LINE__)\
		CSTLogFile::GetLogFile()->WriteData

	#define	STLOG_WRITE_GUID \
		STLOG_EXPAND_INFO(__FILE__, __LINE__) \
		CSTLogFile::GetLogFile()->WriteGUID

	#define	STLOG_WRITE_CLSID\
		STLOG_EXPAND_INFO(__FILE__, __LINE__) \
		CSTLogFile::GetLogFile()->WriteCLSID

	#define	STLOG_WRITE_IID\
		STLOG_EXPAND_INFO(__FILE__, __LINE__) \
		CSTLogFile::GetLogFile()->WriteIID


	#define STLOG_PROFILE_BLOCK \
		STLOG_EXPAND_INFO(__FILE__, __LINE__)\
		static CSTLogFile::Counter *___pCounter___  = CSTLogFile::GetStaticCounter( __FILE__, __LINE__); \
		CSTLogFile::CounterAux __counter_aux__(___pCounter___);  

	#define STLOG_PROFILE_FUNCTION(function_name)	\
	STLOG_EXPAND_INFO(__FILE__, __LINE__)\
	{   CSTLogFile *pLog = CSTLogFile::GetLogFile(); \
		pLog->Write(_T("Estimating call to function %s"), _T(#function_name));  \
		static CSTLogFile::Counter *___pCounter___  = CSTLogFile::GetStaticCounter( __FILE__, __LINE__); \
		CSTLogFile::CounterAux __counter_aux__(___pCounter___);  \
		((void)(function_name)); \
		pLog->Write(_T("Function %s finished in %I64d ms"), _T(#function_name), ___pCounter___->GetTimeFromStart());  \
	}

	#define  STLOG_PROFILE_CHECKPOINT \
		if (___pCounter___) ___pCounter___->CheckPoint(__LINE__);

	#define STLOG_MARKER \
		STLOG_EXPAND_INFO(__FILE__, __LINE__)\
		CSTLogFile::Marker ____marker____

	#define STLOG_LASTERROR \
		STLOG_EXPAND_INFO(__FILE__, __LINE__)\
		CSTLogFile::GetLogFile()->WriteLastError();


	#ifdef STLOG_USE_FOR_TRACE
	#ifdef TRACE 
	#undef TRACE
	#undef TRACE0
	#undef TRACE1
	#undef TRACE2
	#undef TRACE3
	#endif
	#define TRACE STLOG_WRITE
	#define TRACE0 STLOG_WRITE
	#define TRACE1 STLOG_WRITE
	#define TRACE2 STLOG_WRITE
	#define TRACE3 STLOG_WRITE
	#endif

#else 
	inline void _______DoNothing(LPCTSTR, ...) {};
	#define STLOG_WRITE 1? void(0) : _______DoNothing
	#define STLOG_WRITE_DATA 1? void(0) : _______DoNothing
	#define STLOG_PROFILE_FUNCTION(function_name) ((void)(function_name));
	#define STLOG_PROFILE_CHECKPOINT ;
	#define STLOG_PROFILE_BLOCK ;
	#define STLOG_MARKER 1? void(0) : _______DoNothing
	#define STLOG_LASTERROR ;
	#define STLOG_WRITE_GUID 1? void(0) : _______DoNothing
	#define STLOG_WRITE_CLSID 1? void(0) : _______DoNothing
	#define STLOG_WRITE_IID 1? void(0) : _______DoNothing
#endif

//For backward compatibility
#define WRITE_LOG STLOG_WRITE

//Some like it quick
#define STLOG STLOG_WRITE


#endif // ___LOGFILE_H__INCLUDED___

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人精品一区二区三区网站观看| 亚洲美女视频在线观看| 亚洲一区二区在线观看视频| 精品中文字幕一区二区| 在线视频一区二区三区| 久久久噜噜噜久噜久久综合| 亚洲成人动漫在线免费观看| www.亚洲精品| 久久久精品免费免费| 丝袜美腿成人在线| 色综合激情五月| 中文字幕乱码亚洲精品一区| 精品影视av免费| 91超碰这里只有精品国产| 亚洲男人电影天堂| 成人国产一区二区三区精品| 精品国产乱码久久久久久久| 三级在线观看一区二区| 日本韩国精品在线| 中文字幕亚洲欧美在线不卡| 国产黄色精品视频| 精品久久国产老人久久综合| 午夜激情一区二区三区| 欧美亚洲日本国产| 亚洲精品视频在线观看网站| 成人黄色电影在线| 国产欧美在线观看一区| 国产一区二区三区香蕉| 日韩精品一区二区三区蜜臀| 日本欧美加勒比视频| 欧美日韩不卡一区| 亚洲国产你懂的| 欧美日韩一区二区在线观看| 亚洲一区在线观看网站| 久久99国产精品免费网站| 国产宾馆实践打屁股91| 久久久一区二区三区| 久久激情五月激情| 日韩精品中文字幕一区二区三区 | 91黄色在线观看| 国产精品美女久久久久久2018 | 亚洲一区二区欧美| 日本乱码高清不卡字幕| 亚洲免费观看高清在线观看| 91蜜桃传媒精品久久久一区二区| 中文字幕日韩精品一区| 91丨国产丨九色丨pron| 亚洲另类一区二区| 91国偷自产一区二区使用方法| 亚洲欧美在线观看| 色悠悠久久综合| 亚洲日本va在线观看| 日本乱码高清不卡字幕| 午夜国产精品影院在线观看| 欧美一区二区视频在线观看2020| 美女尤物国产一区| 精品99999| 成人小视频在线| 亚洲欧美日韩电影| 欧美日韩国产一级片| 日韩国产在线观看| 2024国产精品视频| 成人午夜电影久久影院| 国产精品国产三级国产有无不卡| 91看片淫黄大片一级在线观看| 一区二区三区精密机械公司| 欧美日韩卡一卡二| 久久精品国产精品亚洲精品| 国产欧美一区二区三区鸳鸯浴| 99这里都是精品| 亚洲午夜免费电影| 欧美久久久久久蜜桃| 91亚洲精品乱码久久久久久蜜桃 | 国产欧美va欧美不卡在线 | 国产一区二区三区免费看| 亚洲欧美激情视频在线观看一区二区三区| 本田岬高潮一区二区三区| 国产精品99久久久久久久女警 | 激情文学综合插| 国产一区二区三区蝌蚪| 日韩影院精彩在线| 国产成人小视频| 成人欧美一区二区三区白人| 91久久一区二区| 美女看a上一区| 欧美三级资源在线| 日本aⅴ免费视频一区二区三区| 精品黑人一区二区三区久久 | 亚洲成人资源在线| 欧美变态凌虐bdsm| 91社区在线播放| 七七婷婷婷婷精品国产| 中文无字幕一区二区三区| 欧美伊人久久久久久久久影院| 国产制服丝袜一区| 亚洲激情五月婷婷| 久久综合色之久久综合| 99精品国产热久久91蜜凸| 琪琪久久久久日韩精品| 国产精品久线观看视频| 91麻豆精品国产无毒不卡在线观看 | 91精品国产综合久久蜜臀 | 免播放器亚洲一区| 中文字幕一区二区三区不卡| 91精品国产综合久久福利软件| 国产精品一线二线三线精华| 婷婷综合在线观看| 中文字幕一区二区三区四区不卡| 欧美一区二区视频观看视频| av电影在线观看完整版一区二区 | 中文字幕一区二区不卡| 欧美电影免费观看高清完整版在| 91麻豆国产福利在线观看| 国产一区在线精品| 日韩专区在线视频| 亚洲人成7777| 国产日韩欧美在线一区| 91麻豆精品国产91久久久使用方法| 成人av免费观看| 久久99精品国产.久久久久 | 久久精品欧美一区二区三区不卡| 欧美日本韩国一区二区三区视频| 成人性视频免费网站| 激情欧美日韩一区二区| 亚洲18色成人| 亚洲精品国产视频| 欧美国产综合一区二区| 精品国产成人在线影院 | 成人在线视频首页| 国内成人免费视频| 蜜臀久久99精品久久久久宅男| 亚洲第一精品在线| 中文字幕日韩一区| 国产精品区一区二区三区| 亚洲精品一区在线观看| 日韩一区二区三区电影| 欧美日韩性生活| 在线免费观看日本欧美| 99免费精品视频| 成人午夜视频福利| 国产成人一区在线| 国产美女在线观看一区| 久久精品国产在热久久| 日韩黄色小视频| 婷婷开心激情综合| 中文字幕在线免费不卡| 制服丝袜亚洲网站| 欧美日本在线观看| 欧美亚洲一区二区在线观看| 在线视频欧美精品| 色老汉一区二区三区| 96av麻豆蜜桃一区二区| av一区二区三区在线| 91污片在线观看| 色呦呦网站一区| 91免费版pro下载短视频| 96av麻豆蜜桃一区二区| 色哟哟国产精品| 91丨九色丨蝌蚪丨老版| 成人av影视在线观看| 成人黄色大片在线观看| 99精品欧美一区| 日本精品视频一区二区三区| 色综合久久久久综合| 色婷婷久久久亚洲一区二区三区| 一本到三区不卡视频| 在线视频综合导航| 欧美精品久久99| 日韩一区二区三区四区五区六区| 日韩一区二区三免费高清| 精品国产成人在线影院 | 欧美色区777第一页| 欧美日韩mp4| 日韩欧美国产不卡| 久久免费国产精品| 中文字幕永久在线不卡| 亚洲精品免费看| 视频在线观看国产精品| 麻豆成人久久精品二区三区小说| 国产一区二区不卡| www.99精品| 欧美性色欧美a在线播放| 制服丝袜激情欧洲亚洲| 亚洲精品一线二线三线| 国产精品国产精品国产专区不片| 亚洲欧美激情一区二区| 日韩二区在线观看| 国产福利精品导航| 色哟哟精品一区| 日韩欧美中文字幕精品| 国产校园另类小说区| 亚洲欧美日韩久久精品| 日韩不卡一区二区| 国产不卡视频在线观看| 91免费国产在线| 日韩一级免费观看| 中文字幕免费不卡| 午夜电影网亚洲视频| 国产精品一级二级三级| 91福利在线观看|