А>В idt возвращается отличное от нуля значение, но TimerProc1 не вызывается!
А>Поможите!
Проверь, что совпадает прототип TimerProc1 с описанием в MSDN.
void CALLBACK TimerProc(
HWND hwnd,
UINT uMsg,
UINT idEvent,
DWORD dwTime );
Напримет, убери преобразование типа из
int idt = ::SetTimer(NULL,NULL,500,(TIMERPROC)TimerProc1);
оставь просто
int idt = ::SetTimer(NULL,NULL,500,TimerProc1);
если прототип неправилен, то должна вылезти ошибка компилятора
А>В idt возвращается отличное от нуля значение, но TimerProc1 не вызывается!
Таймер (даже безоконный, на callback'e), принадлежит потоку, который вызвал SetTimer.
Таймерный callback вызывается изнутри GetMessage() при выгребании сообщений этим потоком.
Потому таймер живёт только пока крутится очередь сообщений.
(например, если поток завершится, то и таймер остановится автоматом).
А>>В idt возвращается отличное от нуля значение, но TimerProc1 не вызывается!
Рек>Таймер (даже безоконный, на callback'e), принадлежит потоку, который вызвал SetTimer. Рек>Таймерный callback вызывается изнутри GetMessage() при выгребании сообщений этим потоком. Рек>Потому таймер живёт только пока крутится очередь сообщений. Рек>(например, если поток завершится, то и таймер остановится автоматом).
Рек>Проверь...
Бальшое спасибо!
Именно в этом была проблема!
Получается любой CALLBACK обрабатывается в GetMessage()?
Здравствуйте Алекс, Вы писали:
А>>>Получается любой CALLBACK обрабатывается в GetMessage()?
AF>>Нет.
А>Прекрасный ответ! Мне все вдруг стало ясно.
Слово CALLBACK обозначает только способ вызова. Масса функций является callback-функциями, но вызываются не из GetMessage. Например, большинство Enum-функций в Win32, такие как EnumWindows, EnumResourceTypes, и т.д., принимают указатель на callback-функцию. Эта функция вызывается непосредственно из Enum-функции, а не из GetMessage. То есть CALLBACK и GetMessage ортогональны друг другу.
Здравствуйте Alex Fedotov, Вы писали:
AF>Здравствуйте Алекс, Вы писали:
А>>>>Получается любой CALLBACK обрабатывается в GetMessage()?
AF>>>Нет.
А>>Прекрасный ответ! Мне все вдруг стало ясно.
AF>Слово CALLBACK обозначает только способ вызова. Масса функций является callback-функциями, но вызываются не из GetMessage. Например, большинство Enum-функций в Win32, такие как EnumWindows, EnumResourceTypes, и т.д., принимают указатель на callback-функцию. Эта функция вызывается непосредственно из Enum-функции, а не из GetMessage. То есть CALLBACK и GetMessage ортогональны друг другу.
А как на счет ReadFileEx(), CopyFileEx() и прочих APC?
А>А как на счет ReadFileEx(), CopyFileEx() и прочих APC?
APC функции могут быть вызваны тогда, когда поток находится в "тревожном состоянии". А это бывает, когда он cпит в одной из SleepEx, SignalObjectAndWait, MsgWaitForMultipleObjectsEx, WaitForMultipleObjectsEx, or WaitForSingleObjectEx
Здравствуйте Алекс, Вы писали:
А>А как на счет ReadFileEx(), CopyFileEx() и прочих APC?
APC — отдельная песня. Они вызываются, когда поток попадает в так называемый alertable state. В это состояние поток попадает при вызове SleepEx или [Msg]WaitFor...Ex. Очередь APC обрабатывается внутри этих функций — когда они возвращают управление с кодом WAIT_IO_COMPLETION, все APC уже обработаны.