DoYourThing() may never be called at all, except when you're lucky enough to get an even multiple of 100. If you're going to use GetTickCount() at all, calculate a delta. Or better yet:
Code:
#include <Windows.h>
#include <process.h>
#include <stdio.h>
DWORD TicksElapsed(DWORD start, DWORD end)
{
if (end < start)
return (0xFFFFFFFFUL - start) + end;
return end - start;
}
struct PeriodicCall
{
HANDLE evExit;
DWORD period;
void (*func)();
};
unsigned __stdcall PeriodicCaller(void *param)
{
PeriodicCall *pc = (PeriodicCall*)param;
DWORD timeout = 0;
for (;;)
{
DWORD status = WaitForSingleObject(pc->evExit, timeout);
if (status == WAIT_TIMEOUT)
{
DWORD start = GetTickCount();
pc->func();
DWORD elapsed = TicksElapsed(start, GetTickCount());
if (elapsed > pc->period)
timeout = 0;
else
timeout = pc->period - elapsed;
}
else
break;
}
return 0;
}
void foo() {printf("foo: %u\n", GetTickCount());}
int main()
{
PeriodicCall pc;
pc.evExit = CreateEvent(0, TRUE, FALSE, 0);
pc.func = &foo;
pc.period = 100;
HANDLE hThread = (HANDLE)_beginthreadex(0, 0, &PeriodicCaller, &pc, 0, 0);
Sleep(1000);
SetEvent(pc.evExit);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
CloseHandle(pc.evExit);
return 0;
}
gg