私のコードでは、前の作業に戻る前に最初にコールバックを呼び出すために、現在の作業からメインスレッドを中断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
。追加のスレッドがデータをできるだけ早くメインスレッドに直接プッシュするようにします。)