#include <windows.h>
#include <stdio.h>
DWORD WINAPI WorkThread(PVOID pParam)
{
HANDLE Event = (HANDLE)pParam;
for(;;)
{
DWORD dwRet = WaitForSingleObjectEx(Event, INFINITE, TRUE);
if(dwRet == WAIT_OBJECT_0)
{
printf("(tid=%d)WAIT_OBJECT_0\n", GetCurrentThreadId());
break;
}
else if(dwRet == WAIT_IO_COMPLETION)
{
printf("(tid=%d)WAIT_IO_COMPLETION\n", GetCurrentThreadId());
}
}
return 0;
}
VOID CALLBACK APCProc(DWORD dwParam)
{
printf("(tid=%d)%s", GetCurrentThreadId(), (PVOID)dwParam);
}
void TestAPC(BOOL bFast)
{
HANDLE QuitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
HANDLE hThread = CreateThread(NULL,
0,
WorkThread,
(PVOID)QuitEvent,
0,
NULL);
Sleep(100); // Wait for WorkThread initialized.
for(int i=5; i>0; i--)
{
printf("(tid=%d)QueueUserAPC(APCProc, hThread)\n", GetCurrentThreadId());
QueueUserAPC(APCProc, hThread, (DWORD)(PVOID)"APC here\n");
if(!bFast)
Sleep(5000);
}
SetEvent(QuitEvent);
printf("(tid=%d)SetEvent(QuitEvent)\n", GetCurrentThreadId());
WaitForSingleObject(hThread, INFINITE);
Sleep(10000);
CloseHandle(hThread);
}
int main()
{
TestAPC(FALSE);
}