Запостил это сообщение в раздел Win32 но, ввиду невысокой активности этого раздела, продублировал тут.
Речь идет о Win32 API'шной функции
BOOL RegisterWaitForSingleObject(
PHANDLE phNewWaitObject, // адрес хендла объекта ожидания
HANDLE hObject, // хендл объекта
WAITORTIMERCALLBACK Callback, // функция обратного вызова
PVOID Context // произвольный параметр
ULONG dwMilliseconds, // таймаут
ULONG dwFlags // флаги
);
Если передать этой функции флаг WT_EXECUTEINWAITTHREAD, то, судя по описанию, функция обратного вызова будет вызвана в самом ожидающем потоке (т.е том потоке, который сделал вызов RegisterWaitForSingleObject).
Получается что вызывающий поток ОБЯЗАТЕЛЬНО ДОЛЖЕН иметь очередь сообщений?
Вызов будет синхронизован циклом выборки сообщений и, соответственно, в функции обратного вызова не нужно парить голову с защитой переменных от конкурентного доступа к переменнм.
Во всяком случае я не понимаю как для потока без очереди сообщений, сделавшего вызов RegisterWaitForSingleObject, может быть сделан callback-вызов исполняющийся в этом же потоке.
Здравствуйте, Аноним, Вы писали:
А>Запостил это сообщение в раздел Win32 но, ввиду невысокой активности этого раздела, продублировал тут.
А>Речь идет о Win32 API'шной функции А>BOOL RegisterWaitForSingleObject( А>PHANDLE phNewWaitObject, // адрес хендла объекта ожидания А>HANDLE hObject, // хендл объекта А>WAITORTIMERCALLBACK Callback, // функция обратного вызова А>PVOID Context // произвольный параметр А>ULONG dwMilliseconds, // таймаут А>ULONG dwFlags // флаги А>);
А>Если передать этой функции флаг WT_EXECUTEINWAITTHREAD, то, судя по описанию, функция обратного вызова будет вызвана в самом ожидающем потоке (т.е том потоке, который сделал вызов RegisterWaitForSingleObject).
А>Получается что вызывающий поток ОБЯЗАТЕЛЬНО ДОЛЖЕН иметь очередь сообщений? А>Вызов будет синхронизован циклом выборки сообщений и, соответственно, в функции обратного вызова не нужно парить голову с защитой переменных от конкурентного доступа к переменнм.
А>Во всяком случае я не понимаю как для потока без очереди сообщений, сделавшего вызов RegisterWaitForSingleObject, может быть сделан callback-вызов исполняющийся в этом же потоке.
очередь сообщений будет автоматически создана при надобности, так что насчет этого пункта не волнуйся
Ovl>очередь сообщений будет автоматически создана при надобности, так что насчет этого пункта не волнуйся
в вопросе насколько я понял речь идёт не об очереди сообщений, а о цикле выборки сообщений. и если очередь автоматически создастся, то вот цикл выборки надо всегда писАть руками.
Здравствуйте, Left2, Вы писали:
Ovl>>очередь сообщений будет автоматически создана при надобности, так что насчет этого пункта не волнуйся
L>в вопросе насколько я понял речь идёт не об очереди сообщений, а о цикле выборки сообщений. и если очередь автоматически создастся, то вот цикл выборки надо всегда писАть руками.
The RegisterWaitForSingleObject function directs a wait thread in the thread pool to wait on the object. The wait thread queues the specified callback function to the thread pool when one of the following occurs:
WT_EXECUTEINWAITTHREAD — The callback function is invoked by the wait thread itself.
New wait threads are created automatically when required. The wait operation is performed by a wait thread from the thread pool
резюме — ожидать сигнала и вызывать callback будет не функция вызвавшая RegisterWaitForSingleObject, а тред в пуле. в ней же вызовется колбэк. цикл выборки не нужен