обнаружить конец нескольких асинхронных обратных вызовов - PullRequest
0 голосов
/ 23 июня 2011

У меня есть код, который собирает все дескрипторы окна в массив. Проблема в том, что поскольку обратные вызовы выполняются асинхронно, я не знаю, когда перечисление фактически завершено. Каков наилучший подход к решению этой проблемы? Я предполагаю, что это распространенная проблема в программировании 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
}

Ответы [ 2 ]

0 голосов
/ 24 июня 2011

Я не эксперт по Windows API, но это общая проблема программирования.

Если у вас есть доступ к структуре типа семафора, которая может ждать (), сигнал () и подсчитывать количествоэлементов, то вы можете заблокировать поток, пока не будет достигнут определенный счет.Каждый асинхронный запрос к окну будет затем сигнализировать () семафору.

В противном случае вы можете сделать общий опрос, проверяя завершение всех элементов, но убедитесь, что поток переходит в спящий режим на определенное время, покав цикле опроса.

0 голосов
/ 23 июня 2011

Обратные вызовы EnumWindows являются синхронными, а не асинхронными. Нет ожидания не требуется. Код после EnumWindows будет выполняться только после завершения всех обратных вызовов ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...