2011-06-23 11 views
0

すべてのウィンドウハンドルを配列に集めるコードがあります。問題は、コールバックが非同期で行われるため、列挙が実際に終了したときはわかりません。これを解決する最良の方法は何ですか?私はこれがWindowsプログラミングの共通の問題だと考えています。複数の非同期コールバックの終了を検出します

BOOL CALLBACK enumWindowsProc3(HWND hwnd, // handle to parent window 
     LPARAM lParam // application-defined value 
) { 

    //add hwnd to array 

    return TRUE; 
} 

int howManyWindows() { 

    EnumWindows (enumWindowsProc3, 0);  

    // need to wait here for EnumWindows() to finish... 

    return array size 
} 

答えて

0

EnumWindowsコールバックは非同期ではなく、同期です。待つ必要はありません。 EnumWindowsは、すべてのコールバックが完了した後にのみ実行されます。

0

私はWindows APIのエキスパートではありませんが、これは一般的なプログラミング上の問題です。

wait()、signal()、アイテム数を与えることができるセマフォ型構造体にアクセスできる場合は、一定のカウントに達するまでスレッドをブロックできます。ウィンドウに対する各非同期クエリは、セマフォにシグナル()します。

それ以外の場合は、すべてのアイテムの完了をチェックする一般的なポーリングを実行できますが、ポーリングループ中にスレッドが一定時間スリープ状態になることを確認してください。

+0

それは問題です - 私はそれが完了するのを知っていません。私はちょうどウィンドウ数を取得する方法を認識していない! – Saideira

+0

いつ完了するのか分かりませんが、サブタスクの完了時に非同期応答が得られますか?上記のいずれの方法を使っても、各サブタスクの完了を追跡し、完了したメインタスクに信号を送ることができます。もちろん、直接的なAPIソリューションもあるかもしれません。 – ricosrealm

関連する問題