В моя код използвам 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
е правилният начин да постигна целта си (==> вижте моите други въпрос):
- Как мога да накарам това да работи?
Ако трябва някакъв друг метод за прекъсване на основната нишка:
- Какъв друг метод трябва да използвам? (Имайте предвид, че не искам да използвам метода на изтеглянев главната нишка за това като
WaitForSingleObject
или избиране. Искам допълнителната нишка да избутва-е своите данни направо в основната нишка, възможно най-скоро.)