APC Queue

Тема в разделе "WASM.WIN32", создана пользователем not1, 9 апр 2018.

  1. not1

    not1 Member

    Публикаций:
    0
    Регистрация:
    6 окт 2009
    Сообщения:
    137
    Всем привет, как с помощью WINAPI получить количество данных в очереди APC?
    Например есть APC-Routime.
    VOID NTAPI ApcRoutime( IN PVOID ApcContext,
    IN PIO_STATUS_BLOCK IoStatusBlock,
    IN ULONG Reserved)
    {
    /....
    //Тут допустим какой код, для обработки результатов.
    //Если данных больше нет для обработки
    bComplete = TRUE;

    }

    Далее допустим создается объект, в котором мы указываем что данные должны поступать в нашу
    APC-Routime.
    HANDLE hTest = BlaBlaBla(NULL, ApcRoutime, lpApcContext, NULL, 0, 0);

    Далее мы должны перевести в поток в alertable состояние с помощью одной из функций
    SleepEx, WaitForSingleObjectEx и т.д, более подробно тут

    https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms681951(v=vs.85).aspx
    Как можно узнать, есть ли у потока в очереди APC задания, и если есть мы вызываем допустим
    эту функцию SleepEx(1000, TRUE); Сейчас я использую while(!bComplete) SleepEx(1000, TRUE); Думаю что это
    не совсем нормальный способ
     
  2. HESH

    HESH Active Member

    Публикаций:
    2
    Регистрация:
    20 мар 2008
    Сообщения:
    143
    Суть задачи не совсем понятна. Если я правильно понял, судя по bComplete, необходимо дождаться выполнения обработки. Если так - то критические секции в твоем случае вполне юзабельны.
    P.S.: забудь про Sleep в таких вещах. Только функции синхронизации.

    Код (Text):
    1. EnterCriticalSection
    2. bla...bla...bla...
    Код (Text):
    1. LeaveCriticalSection
    Ожидающий поток, так же использующий EnterCriticalSection, не завладеет критической секцией до тех пор, пока обработчик не завершит работу. Завладел - вперед за работу. Отработал - освободи секцию. Тонкость в том, что EnterCriticalSection ждет бесконечно долго и можно поймать deadlock. Что бы этого избежать, так же применяют TryEnterCriticalSection.
     
    not1 нравится это.