SetTimer
От: Алекс Россия http://wise-orm.com
Дата: 24.04.02 10:30
Оценка:
Привет, программеры!

Не понимаю, почему не создаеться таймер?
int idt = ::SetTimer(NULL,NULL,500,(TIMERPROC)TimerProc1);

В idt возвращается отличное от нуля значение, но TimerProc1 не вызывается!

Поможите!
Re: SetTimer
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 24.04.02 10:38
Оценка:
Здравствуйте Алекс, Вы писали:

А>Привет, программеры!


А>Не понимаю, почему не создаеться таймер?

А>
А>int idt = ::SetTimer(NULL,NULL,500,(TIMERPROC)TimerProc1);
А>

А>В idt возвращается отличное от нуля значение, но TimerProc1 не вызывается!

1. Параметры твоей TimerProc1 точно совпадают с тем что должно быть —

VOID CALLBACK TimerProc1(
  HWND hwnd,     // handle of window for timer messages
  UINT uMsg,     // WM_TIMER message
  UINT idEvent,  // timer identifier
  DWORD dwTime   // current system time
);


2. Надеюсь она не член к-л класса
Re: SetTimer
От: klim1978 Украина  
Дата: 24.04.02 10:48
Оценка:
Здравствуйте Алекс, Вы писали:

А>Привет, программеры!


А>Не понимаю, почему не создаеться таймер?

А>
А>int idt = ::SetTimer(NULL,NULL,500,(TIMERPROC)TimerProc1);
А>

А>В 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);
если прототип неправилен, то должна вылезти ошибка компилятора
Киев
Re: SetTimer
От: Ed.ward Россия  
Дата: 24.04.02 11:42
Оценка:
Здравствуйте Алекс, Вы писали:

А>Привет, программеры!


А>Не понимаю, почему не создаеться таймер?

А>
А>int idt = ::SetTimer(NULL,NULL,500,(TIMERPROC)TimerProc1);
А>

А>В idt возвращается отличное от нуля значение, но TimerProc1 не вызывается!

А>Поможите!


А в каком приложении ты вызываешь эту функцию, не в консольном случайно?
конретнее у тебя в приложении есть MessageLoop?

Ed.ward
Re: SetTimer
От: Рек Россия  
Дата: 24.04.02 13:36
Оценка: 9 (1)
Здравствуйте Алекс, Вы писали:

А>Не понимаю, почему не создаеться таймер?

А>
А>int idt = ::SetTimer(NULL,NULL,500,(TIMERPROC)TimerProc1);
А>

А>В idt возвращается отличное от нуля значение, но TimerProc1 не вызывается!


Таймер (даже безоконный, на callback'e), принадлежит потоку, который вызвал SetTimer.
Таймерный callback вызывается изнутри GetMessage() при выгребании сообщений этим потоком.
Потому таймер живёт только пока крутится очередь сообщений.
(например, если поток завершится, то и таймер остановится автоматом).

Проверь...
Re: SetTimer
От: adontz Грузия http://adontz.wordpress.com/
Дата: 24.04.02 16:34
Оценка:
Здравствуйте Алекс, Вы писали:

А>Привет, программеры!


А>Не понимаю, почему не создаеться таймер?

А>
А>int idt = ::SetTimer(NULL,NULL,500,(TIMERPROC)TimerProc1);
А>

А>В idt возвращается отличное от нуля значение, но TimerProc1 не вызывается!

А>Поможите!


А корректный HWND кто укажет ?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: SetTimer
От: Рек Россия  
Дата: 24.04.02 19:12
Оценка:
Здравствуйте adontz, Вы писали:

A>Здравствуйте Алекс, Вы писали:


А>>Привет, программеры!


А>>Не понимаю, почему не создаеться таймер?

А>>
А>>int idt = ::SetTimer(NULL,NULL,500,(TIMERPROC)TimerProc1);
А>>

А>>В idt возвращается отличное от нуля значение, но TimerProc1 не вызывается!

А>>Поможите!


A>А корректный HWND кто укажет ?


Пушкин!

Потому что, не нужен здесь HWND.
Re[2]: SetTimer
От: Алекс Россия http://wise-orm.com
Дата: 25.04.02 04:23
Оценка:
Здравствуйте Рек, Вы писали:

Рек>Здравствуйте Алекс, Вы писали:


А>>Не понимаю, почему не создаеться таймер?

А>>
А>>int idt = ::SetTimer(NULL,NULL,500,(TIMERPROC)TimerProc1);
А>>

А>>В idt возвращается отличное от нуля значение, но TimerProc1 не вызывается!


Рек>Таймер (даже безоконный, на callback'e), принадлежит потоку, который вызвал SetTimer.

Рек>Таймерный callback вызывается изнутри GetMessage() при выгребании сообщений этим потоком.
Рек>Потому таймер живёт только пока крутится очередь сообщений.
Рек>(например, если поток завершится, то и таймер остановится автоматом).

Рек>Проверь...


Бальшое спасибо!
Именно в этом была проблема!
Получается любой CALLBACK обрабатывается в GetMessage()?
Re[3]: SetTimer
От: Alex Fedotov США  
Дата: 25.04.02 05:18
Оценка:
Здравствуйте Алекс, Вы писали:

А>Получается любой CALLBACK обрабатывается в GetMessage()?


Нет.
-- Alex Fedotov
Re[4]: SetTimer
От: Алекс Россия http://wise-orm.com
Дата: 25.04.02 05:27
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

AF>Здравствуйте Алекс, Вы писали:


А>>Получается любой CALLBACK обрабатывается в GetMessage()?


AF>Нет.


Прекрасный ответ! Мне все вдруг стало ясно.
Re[5]: SetTimer
От: Alex Fedotov США  
Дата: 25.04.02 05:38
Оценка:
Здравствуйте Алекс, Вы писали:

А>>>Получается любой CALLBACK обрабатывается в GetMessage()?


AF>>Нет.


А>Прекрасный ответ! Мне все вдруг стало ясно.


Слово CALLBACK обозначает только способ вызова. Масса функций является callback-функциями, но вызываются не из GetMessage. Например, большинство Enum-функций в Win32, такие как EnumWindows, EnumResourceTypes, и т.д., принимают указатель на callback-функцию. Эта функция вызывается непосредственно из Enum-функции, а не из GetMessage. То есть CALLBACK и GetMessage ортогональны друг другу.
-- Alex Fedotov
Re[6]: SetTimer
От: Алекс Россия http://wise-orm.com
Дата: 25.04.02 05:45
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

AF>Здравствуйте Алекс, Вы писали:


А>>>>Получается любой CALLBACK обрабатывается в GetMessage()?


AF>>>Нет.


А>>Прекрасный ответ! Мне все вдруг стало ясно.


AF>Слово CALLBACK обозначает только способ вызова. Масса функций является callback-функциями, но вызываются не из GetMessage. Например, большинство Enum-функций в Win32, такие как EnumWindows, EnumResourceTypes, и т.д., принимают указатель на callback-функцию. Эта функция вызывается непосредственно из Enum-функции, а не из GetMessage. То есть CALLBACK и GetMessage ортогональны друг другу.


А как на счет ReadFileEx(), CopyFileEx() и прочих APC?
Re[7]: SetTimer
От: Алексей Петров Россия  
Дата: 25.04.02 05:49
Оценка:
Здравствуйте Алекс, Вы писали:


А>А как на счет ReadFileEx(), CopyFileEx() и прочих APC?


APC функции могут быть вызваны тогда, когда поток находится в "тревожном состоянии". А это бывает, когда он cпит в одной из SleepEx, SignalObjectAndWait, MsgWaitForMultipleObjectsEx, WaitForMultipleObjectsEx, or WaitForSingleObjectEx
Re[7]: SetTimer
От: Alex Fedotov США  
Дата: 25.04.02 05:50
Оценка:
Здравствуйте Алекс, Вы писали:

А>А как на счет ReadFileEx(), CopyFileEx() и прочих APC?


APC — отдельная песня. Они вызываются, когда поток попадает в так называемый alertable state. В это состояние поток попадает при вызове SleepEx или [Msg]WaitFor...Ex. Очередь APC обрабатывается внутри этих функций — когда они возвращают управление с кодом WAIT_IO_COMPLETION, все APC уже обработаны.
-- Alex Fedotov
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.