| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Работа с таймером |
| Автор: decembrist 28.2.2005, 15:52 | ||||
| Народ, подскажите, кто знает! Я работаю с функцией
где в Draw у меня основной код, перерисовывается по auxMainLoop(Draw); в цикле. А мне нужно, работать через таймер. Как это сделать??? Я вызвал в main SetTimer(NULL, 0, 40, (TIMERPROC) MyTimerProc); где в MyTimerProc код идентичный ф-ции Draw:
|
| Автор: Ni@m 28.2.2005, 16:39 |
| По спецификации // это вроде в апи UINT SetTimer( UINT nIDEvent, UINT nElapse, void ( CALLBACK* lpfnTimer )(HWND, UINT, UINT, DWORD) = NULL ) throw(); // a вот это в SDK UINT_PTR SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc ); Попробуй апишную |
| Автор: decembrist 1.3.2005, 11:20 |
| Спасибо, сейчас попробую |
| Автор: decembrist 1.3.2005, 12:02 |
| Ni@m в апи не получится, мне тогда код программы нужно будет переписывать под апи, это дофига работы. Мне в SDK нужно |
| Автор: chipset 1.3.2005, 12:11 |
| Может быть такое, что auxMainLoop ещё что-то делает, кроме вызова функции? |
| Автор: decembrist 1.3.2005, 12:38 |
| Нет, у меня в main только одна строка auxMainLoop(Draw) Добавлено @ 12:41 Дело в том, что в Draw по инкременту перерисовывается некий объект, скорость перерисовки зависит от приращения. А я хочу чтобы он перерисовывался по таймеру |
| Автор: maxim1000 1.3.2005, 12:57 | ||
а можно поинтересоваться, что это за среда разработки и почему программу придется переписывать под API? Добавлено @ 12:58 а точнее, что мешает в первой строке программы написать #include <windows.h> и потом пользоваться API-шными функциями? |
| Автор: maxim1000 1.3.2005, 13:35 | ||
здесь происходит запуск таймера, а потом почти сразу выход из программы вообще, таймер просто не успевает сработать нужно зациклить программу (например while(true)) |
| Автор: decembrist 2.3.2005, 12:53 | ||
| Блин, совсем запутался! Еще раз
где в MyTimerProc() у меня основной код который должен повторяться через определенный интервал времени. Почему он не успевает сработать? Пробовал maxim1000 while (true) { SetTimer(NULL, 0, 40, (TIMERPROC) MyTimerProc); } тогда происходит запуск в цикле таймера, а не процедуры MyTimerProc? |
| Автор: maxim1000 2.3.2005, 12:55 | ||
| не так SetTimer(...) всего лишь запускает процесс периодических вызовов через указанное время процедура будет вызвана единственное, что нужно - чтобы приложение в этот момент еще не завершилось поэтому нужно сделать:
|
| Автор: decembrist 2.3.2005, 13:02 |
| Спасибо Добавлено @ 13:07 Попробовал, последняя строка while(true); зациклила прогу, а таймер не вызывает ф-цию MyTimerProc? |
| Автор: maxim1000 2.3.2005, 13:23 | ||||
| хм...непонятно... с одной стороны в MSDN говорится, что необходимо наличие окна для обработки сообщения от таймера хотя бы для того, чтобы автоматически вызвать функцию таймера
с другой стороны там же (только выше) говорится, что можно обойтись без окна вообще:
Добавлено @ 13:24 или,может,они полагаются на то, что Рабочий стол (0-й handle указывает на него, насколько мне известно) сам обработает это сообщение и вызовет функцию...как-то не верится... Добавлено @ 13:25 ладно, я все равно обычно пользуюсь ожидаемыми таймерами: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/using_waitable_timer_objects.asp |
| Автор: decembrist 2.3.2005, 13:36 | ||
Я попробовал так
auxMainLoop(Draw); работает как обработчик сообщения WM_PAINT то есть вызывает перерисовку созданного мной изображения. Теперь идет обращение к MyTimerProc(). Но у меня другой глюк всплыл. На SetTimer я устанавливаю разные интервалы временип, а у меня одна скорость |
| Автор: maxim1000 2.3.2005, 13:45 | ||
| а-а-а-а... как же до меня не дошло сразу... все предельно просто: надо просто вспомнить, что сообщения приходят не к окнам, а к потокам, которые их создали, а те уже (если захотят, конечно) рассылают их своим окнам а тут ничего даже рассылать не надо:
Добавлено @ 13:48 ну вот...а тут уже ответили... http://forum.vingrad.ru/index.php?showtopic=44017&hl= вот что бывает, когда в двух темах идет обсуждение практически одного вопроса... |
| Автор: decembrist 2.3.2005, 13:58 |
| Спасибо, maxim1000 за помощь. |
| Автор: decembrist 4.3.2005, 11:49 | ||||
| Народ, у меня всплыла такая фигня!Когда я переписал прогу под таймер (по вашим рекомендациям Вот программа до включения таймера:
а вот после:
где ф-ция MyTimerProc вызывает Draw() |
| Автор: decembrist 4.3.2005, 12:16 |
| Тут что-то с перерисовкой auxReshapeFunc((AUXRESHAPEPROC)Reshape); только я никак не могу понять что именно |
| Автор: decembrist 4.3.2005, 13:49 |
| Тестировал пошагово, на строчке auxReshapeFunc((AUXRESHAPEPROC)Reshape); первый раз, при запуске нет вхождения в ф-цию Reshape, в отличие от первого варианта... Только вот почему понять не могу. |