在我的代码中,我使用QueueUserAPC
中断他当前工作的主线程,以便在返回他之前的工作之前先调用一些回调。
std::string buffer;
std::tr1::shared_ptr<void> hMainThread;
VOID CALLBACK myCallback (ULONG_PTR dwParam) {
FILE * f = fopen("somefile", "a");
fprintf(f, "CALLBACK WAS INVOKED!\n");
fclose(f);
}
void AdditionalThread () {
// download some file using synchronous wininet and store the
// HTTP response in buffer
QueueUserAPC(myCallback, hMainThread.get(), (ULONG_PTR)0);
}
void storeHandle () {
HANDLE hUnsafe;
DuplicateHandle(GetCurrentProcess(), GetCurrentThread(),
GetCurrentProcess(), &hUnsafe, 0, FALSE, DUPLICATE_SAME_ACCESS);
hMainThread.reset(hUnsafe, CloseHandle);
}
void startSecondThread () {
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)AdditionalThread, 0, 0, NULL);
}
storeHandle
并startSecondThread
暴露于在主线程中运行的 Lua 解释器以及其他东西。我现在做的是
storeHandle
从我的 Lua 解释器调用。DuplicateHandle
返回一个非零值,因此成功。startSecondThread
从我的 Lua 解释器调用。附加线程正确启动,并QueueUserAPC
返回一个非零值,说明一切顺利。- 据我了解
QueueUserAPC
,myCallback
现在应该从主线程调用。然而,事实并非如此。
如果QueueUserAPC
是实现我的目标的正确方法(==> 请参阅我的其他问题):
- 我怎样才能得到这个工作?
如果我应该使用其他方法来中断主线程:
- 我应该使用什么其他方法?(请注意,我不想在主线程中使用pull -ing 方法来进行类似
WaitForSingleObject
或轮询。我希望附加线程push -es 它的数据尽快直接进入主线程。)