【发布时间】:2009-12-30 13:14:50
【问题描述】:
在我的代码中,我使用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 解释器,该解释器与其他东西一起在主线程中运行。我现在做的是
- 从我的 Lua 解释器调用
storeHandle。DuplicateHandle返回一个非零值,因此成功。 - 从我的 Lua 解释器调用
startSecondThread。附加线程正常启动,QueueUserAPC返回一个非零值,表示一切顺利。 - 据我了解
QueueUserAPC,myCallback现在应该从主线程调用。然而,事实并非如此。
如果QueueUserAPC 是实现我的目标的正确方法(==> 见我的另一个question):
- 我怎样才能让它工作?
如果我应该使用其他方法来中断主线程:
- 我应该使用什么其他方法? (请注意,我不想在主线程中使用 pull-ing 方法,例如
WaitForSingleObject或轮询。我希望附加线程 push-es它的数据会尽快直接进入主线程。)
【问题讨论】:
标签: c++ windows multithreading signals interrupt