为什么QueueUserAPC使得主线程的Wait立刻返回?解决方法
为什么QueueUserAPC使得主线程的Wait立刻返回?
我写了一个很简单的main函数,Wait函数等待一个没有信号的event,10秒钟后超时返回。运行没有问题。
但是,如果我加上了一句QueueUserAPC的调用,这个WaitForMultipleObjectsEx就会立刻返回,超时参数没有起作用。
这到底是为什么呢? QueueUserAPC有什么特殊的效果么,我只是设定了一个很简单的APC返回参数结果。
------解决方案--------------------
user mode apc就是这样工作的,你的等待是alertable,这样可以执行apc
你可以通过wait的的返回值判断是否由于apc,必要时继续等待
------解决方案--------------------
你先用不是alertable的等待,再用alertable的
我写了一个很简单的main函数,Wait函数等待一个没有信号的event,10秒钟后超时返回。运行没有问题。
- C/C++ code
HANDLE hThread=OpenThread( THREAD_SET_CONTEXT, FALSE, GetCurrentThreadId()); HANDLE ah[ 1 ] = { CreateEvent( NULL, TRUE, FALSE, NULL) }; DWORD dwWait = WaitForMultipleObjectsEx( 1,ah,FALSE, // wait all 10000, true ); // alertable
但是,如果我加上了一句QueueUserAPC的调用,这个WaitForMultipleObjectsEx就会立刻返回,超时参数没有起作用。
- C/C++ code
VOID CALLBACK APCProc(ULONG_PTR dwParam){ printf("hello, apc timeout\n"); } ... ... HANDLE hThread=OpenThread( THREAD_SET_CONTEXT, FALSE, GetCurrentThreadId()); QueueUserAPC(APCProc,hThread,0); HANDLE ah[ 1 ] = { CreateEvent( NULL, TRUE, FALSE, NULL) }; DWORD dwWait = WaitForMultipleObjectsEx( 1,ah,FALSE, // wait all 10000, true ); // alertable
这到底是为什么呢? QueueUserAPC有什么特殊的效果么,我只是设定了一个很简单的APC返回参数结果。
------解决方案--------------------
user mode apc就是这样工作的,你的等待是alertable,这样可以执行apc
你可以通过wait的的返回值判断是否由于apc,必要时继续等待
------解决方案--------------------
你先用不是alertable的等待,再用alertable的