In meinem Code verwende ich QueueUserAPC
a unterbrechen den Haupt-Thread von seiner aktuellen Arbeit zu trennen, um zuerst einen Rückruf aufzurufen, bevor er zu seiner vorherigen Arbeit zurückkehrt.
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
y startSecondThread
sind einem Lua-Interpreter ausgesetzt, der zusammen mit anderen Dingen im Hauptthread läuft. Was ich jetzt mache, ist
- aufrufen.
storeHandle
von meinem Lua-Interpreter.DuplicateHandle
einen Wert ungleich Null zurück und ist daher erfolgreich. - aufrufen.
startSecondThread
von meinem Lua-Interpreter. Der zusätzliche Thread wird ordnungsgemäß gestartet, undQueueUserAPC
einen Wert ungleich Null zurück, was bedeutet, dass alles gut gelaufen ist. - soweit ich verstanden habe
QueueUserAPC
,myCallback
sollte nun vom Hauptthread aufgerufen werden. Das ist jedoch nicht der Fall.
Si QueueUserAPC
ist der richtige Weg, um mein Ziel zu erreichen (==> siehe meine andere Frage ):
- Wie kann ich das zum Laufen bringen?
Wenn ich eine andere Methode, um den Haupt-Thread zu unterbrechen sollte:
- Welche andere Methode sollte ich anwenden? (Beachten Sie, dass ich nicht verwenden möchte ziehen -Methode im Haupt-Thread für diesen Zweck wie
WaitForSingleObject
oder Umfragen. Ich möchte, dass der zusätzliche Thread drücken. -seine Daten so schnell wie möglich direkt in den Hauptthread).