#ifndef _TEST_TICK_H_0416
#define _TEST_TICK_H_0416
#ifndef ImtLogINFO
#define ImtLogINFO(x) LogTickCount x
#endif
#if defined(_DEBUG_TICK_)||!defined(ImtLogINFO)
__inline void LogTickCount(LPCTSTR format, ...)
{
TCHAR sz[MAX_PATH];
FILE* fp;
va_list va;
va_start(va, format);
#ifdef _INC_TCHAR
_vstprintf(sz, format, va);
#else
vsprintf(sz, format, va);
#endif
va_end(va);
fp = fopen("C:\\TestTick.txt", "a+");
if (!fp)
{
return;
}
fprintf(fp,"%s\n", sz);
fclose(fp);
}
#endif
#ifdef _DEBUG_TICK_
#define LOGTICK(x) LogTickCount x
#else
#define LOGTICK ImtLogINFO
#endif //_DEBUG_TICK_
#define TICK_STATUS_STOPPED 3
#define TICK_STATUS_RUNNING 1
#define TICK_STATUS_PAUSE 2
#pragma pack(1)
typedef struct __tickitem
{
unsigned char status; //计时器状态
char szName[19]; //计时器描述
unsigned long ulTickCount; //计时器数据
unsigned long ulTickTimes; //计时器计时次数
unsigned long ulLastStop; //最后一次停止的时间
unsigned long userdata;
}TICK_ITEM,FAR* LPTICK_ITEM;
#pragma pack()
extern LPTICK_ITEM g_lpTickItem;
extern CONST BYTE g_nMaxTickCount;
extern BOOLEAN g_bTickEnable;
#define TickGetEnable() g_lpTickItem
#define TickGetItemCount() g_nMaxTickCount
#define TickResetAll() if(g_lpTickItem)memset(g_lpTickItem, 0, sizeof(TICK_ITEM)*g_nMaxTickCount)
#define TickSetEnable(b) g_bTickEnable = b
#define TickAddUserData(i, u) do{if (g_lpTickItem)g_lpTickItem[i].userdata += u;}while(0)
#define USE_TICK(count, en) TICK_ITEM g_TickItem[count] = {0};LPTICK_ITEM g_lpTickItem = g_TickItem; CONST BYTE g_nMaxTickCount = count;BOOLEAN g_bTickEnable = en
#define TickStart(i, N) do{\
if (!g_bTickEnable)break;\
if ((i) >= 0 && (i) < g_nMaxTickCount)\
{\
if (g_lpTickItem[i].status == TICK_STATUS_STOPPED || g_lpTickItem[i].status == 0 )\
{\
g_lpTickItem[i].ulTickCount = GetTickCount();\
g_lpTickItem[i].ulTickTimes = 1;\
memcpy(g_lpTickItem[i].szName, N, sizeof(g_lpTickItem[i].szName) - 1);\
}\
else if (g_lpTickItem[i].status == TICK_STATUS_PAUSE)\
{\
g_lpTickItem[i].ulTickCount = GetTickCount() - g_lpTickItem[i].ulTickCount;\
g_lpTickItem[i].ulTickTimes = g_lpTickItem[i].ulTickTimes + 1;\
}\
g_lpTickItem[i].status = TICK_STATUS_RUNNING;\
}\
}while(0)
#define TickStop(i) do{\
if (!g_bTickEnable)break;\
if ((i) >= 0 && (i) < g_nMaxTickCount)\
{\
if (g_lpTickItem[i].status == TICK_STATUS_RUNNING)\
{\
g_lpTickItem[i].ulTickCount = GetTickCount()-g_lpTickItem[i].ulTickCount;\
g_lpTickItem[i].ulLastStop = GetTickCount();\
}\
g_lpTickItem[i].status = TICK_STATUS_STOPPED;\
}\
}while(0)
#define TickPause(i) do {\
if (!g_bTickEnable)break;\
if ((i) >= 0 && (i) < g_nMaxTickCount && g_lpTickItem[i].status == TICK_STATUS_RUNNING)\
{\
g_lpTickItem[i].ulTickCount = GetTickCount() - g_lpTickItem[i].ulTickCount;\
g_lpTickItem[i].ulLastStop = GetTickCount();\
g_lpTickItem[i].status = TICK_STATUS_PAUSE;\
}\
}while(0)
#define TickStopAll() do{int __i;if (!g_bTickEnable)break;for(__i=0;__i<g_nMaxTickCount;__i++)if(g_lpTickItem[__i].status != 0)TickStop(__i);}while(0)
#define TickGet(pt,i) do{if (!g_bTickEnable)break;if ((i) >= 0 && (i) < g_nMaxTickCount) *(pt) = g_lpTickItem[i].ulTickCount;}while(0)
#define TickLogInfo(i) do{if (!g_bTickEnable)break;if ((i) >= 0 && (i) < g_nMaxTickCount)LOGTICK(("LastStop:%-10luTick%02lu(ms):%-10luTimes:%-10lu%s", g_lpTickItem[i].ulLastStop, (long)i,g_lpTickItem[i].ulTickCount,g_lpTickItem[i].ulTickTimes,g_lpTickItem[i].szName));}while(0)
#define TickLogAllUsed() do{\
int __i;\
if (!g_bTickEnable)break;\
for(__i=0;__i<g_nMaxTickCount;__i++)\
if(g_lpTickItem[__i].status != 0 && g_lpTickItem[__i].ulTickTimes)\
TickLogInfo(__i);\
}while(0)
#define TickStopAndLogAllUsed() do{TickStopAll();TickLogAllUsed();}while(0)
#endif//_TEST_TICK_H_0416
使用方法:
#define ImtLogINFO(x) LogInfo x
#include "TestTick.h"
USE_TICK(100, TRUE);
void LogInfo(LPCSTR lpFormat, ...)
{
va_list va;
va_start(va, lpFormat);
vprintf(lpFormat, va);
printf("\n");
va_end(va);
}
void test()
{
TickStart(0, "test");
Sleep(1000);
TickPause(0);
}
int main(int argc, char* argv[])
{
TickResetAll();
for (int i = 0; i < 10; i++)
{
test();
}
TickStopAndLogAllUsed();
getchar();
return 0;
}
运行结果: