/* Written by Fnems 2010-Oct-23 This file works as a frame fnems@tom.com for your reference */ #include #include "algo.h" void CALLBACK tmr_ckeck(HWND hwnd, UINT umsg, UINT idevent, DWORD dwtime) { /* Beep(440,100); */ trace_regular_check(); return; } DWORD WINAPI thread_msg_loop(VOID* arg) { MSG msg; UINT tmr_id; HANDLE *events; events = (HANDLE *)arg; SetEvent(events[0]); while (GetMessage(&msg, NULL, 0, 0)) { switch(msg.message) { case WM_USER+10: trace_init(); tmr_id = SetTimer(NULL, 0, 1000, &tmr_ckeck); break; case WM_USER+11: KillTimer(0, tmr_id); trace_exit(); SetEvent(events[1]); break; case WM_TIMER: ((TIMERPROC)msg.lParam)(0, 0, 0, 0); break; default: TranslateMessage (&msg); DispatchMessage (&msg); } } return 0; } int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) { DWORD thread_id; HANDLE hthread; HANDLE hevent_thread[2]; HANDLE *hevent_thread_create; HANDLE *hevent_thread_close; DWORD dwevent_create; DWORD dwevent_close; hevent_thread_create = &(hevent_thread[0]); hevent_thread_close = &(hevent_thread[1]); *hevent_thread_create = CreateEvent(NULL, FALSE, FALSE, NULL); *hevent_thread_close = CreateEvent(NULL, FALSE, FALSE, NULL); hthread = CreateThread(NULL, 2000, &thread_msg_loop, hevent_thread, 0, &thread_id); dwevent_create = WaitForSingleObject(*hevent_thread_create, 2000); Beep(800,100); Sleep(50); if(dwevent_create != WAIT_OBJECT_0) { Beep(800,100); return 1; } PostThreadMessageA(thread_id, WM_USER+10, 0, 0); while(dwevent_close!=WAIT_OBJECT_0) { dwevent_close = WaitForSingleObject(*hevent_thread_close, 200); } CloseHandle(*hevent_thread_close); CloseHandle(*hevent_thread_create); return 0; }