バックグラウンド スレッドに、メイン スレッドのミューテックス変数にフラグを設定させます。これにより、バックグラウンド スレッド (メイン スレッド) に、実行中の処理を続行しても安全であることを伝えます。これはストップ ライトのようなものです。すべてのコーナー (両側) には、相互に関連するライトがあります。
メイン スレッドは一時停止しませんが、(gui などの) メッセージを処理する while ループを使用できますが、ミューテックス変数が設定されるまでループを中断しません。これはバックグラウンド スレッドで発生します。
開始するための参考資料を次に示します。
編集 -- リクエストごと:
グローバルに、ミューテックス ハンドルと変数を定義します。
HANDLE sharedMemoryMutex = CreateMutex(NULL, FALSE, "My mutex =)!");
BOOL good2Go = false;
次に、バックグラウンド スレッドでは、次のようになります。
void wait() {
// First, we sleep...
sleep(3000);
// Now, we request a lock on the good2Go variable, so that when we write to
// it, no other thread is:
DWORD dwWaitResult = WaitForSingleObject(sharedMemoryMutex, INFINITE);
if (dwWaitResult == WAIT_OBJECT_0 || dwWaitResult == WAIT_ABANDONED) {
if (dwWaitResult == WAIT_ABANDONED) {
// Shared memory is maybe in inconsistent state because other program
// crashed while holding the mutex. Check the memory for consistency
...
}
// Access your shared memory
good2Go = true;
// Release the lock so that the main thread can read the variable again..
ReleaseMutex(sharedMemoryMutex);
}
次に、メインスレッドでは、次のようになります。
// Create your background wait thread:
// .....
while(true) {
// Handle messages so that your program doesn't appear frozen.
// You will have to do your research on this one =)
YourMessageHandler();
// Request a lock on the good2Go variable, so we can read it w/o corrupting it
DWORD dwWaitResult = WaitForSingleObject(sharedMemoryMutex, INFINITE);
if (dwWaitResult == WAIT_OBJECT_0 || dwWaitResult == WAIT_ABANDONED) {
if (dwWaitResult == WAIT_ABANDONED) {
// Shared memory is maybe in inconsistent state because other program
// crashed while holding the mutex. Check the memory for consistency
...
}
// Exit the loop
if( good2Go ) { ReleaseMutex(sharedMemoryMutex); break; }
ReleaseMutex(sharedMemoryMutex);
}
// Continue your code after the 3 pause....
まだわからない場合は、メッセージの処理方法を理解する必要があります。また、ミューテックスの実装は異なる場合がありますが、VC を使用しているとのことでしたので、上記の win32 実装で問題ありません。そして、私はあなたが一般的な概念を理解していると思います