Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с таймером 
:(
    Опции темы
decembrist
  Дата 28.2.2005, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 1.4.2004

Репутация: нет
Всего: нет



Народ, подскажите, кто знает!
Я работаю с функцией
Код

int main (int argc,char **argv)
{
   ...
 Init();
   ...
 auxReshapeFunc((AUXRESHAPEPROC)Reshape);
 auxMainLoop(Draw);
 return 0;
}

где в Draw у меня основной код, перерисовывается по auxMainLoop(Draw); в цикле.
А мне нужно, работать через таймер. Как это сделать???
Я вызвал в main
SetTimer(NULL, 0, 40, (TIMERPROC) MyTimerProc);
где в MyTimerProc код идентичный ф-ции Draw:
Код

int main (int argc,char **argv)
{
   ...
 Init();
   ...
 SetTimer(NULL, 0, 40, (TIMERPROC) MyTimerProc);
 auxReshapeFunc((AUXRESHAPEPROC)Reshape);
 //auxMainLoop(Draw);
 return 0;
}
По идее MyTimerProc() должна вызываться в цикле вместо Draw(), но не выходит. В чем моя ошибка? smile

PM MAIL   Вверх
Ni@m
Дата 28.2.2005, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 11.3.2004
Где: почти Киев

Репутация: 0
Всего: 6



По спецификации

// это вроде в апи
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
);

Попробуй апишную
--------------------
Обучение - как переливание воды из одной чашки в другую: всегда лучше, чтоб чашка со знаниями нахордилась выше.
PM MAIL WWW ICQ   Вверх
decembrist
Дата 1.3.2005, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 1.4.2004

Репутация: нет
Всего: нет



Спасибо, сейчас попробую smile
PM MAIL   Вверх
decembrist
Дата 1.3.2005, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 1.4.2004

Репутация: нет
Всего: нет



Ni@m в апи не получится, мне тогда код программы нужно будет переписывать под апи, это дофига работы. Мне в SDK нужно smile

PM MAIL   Вверх
chipset
Дата 1.3.2005, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Может быть такое, что auxMainLoop ещё что-то делает, кроме вызова функции?

Это сообщение отредактировал(а) chipset - 1.3.2005, 12:12


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
decembrist
Дата 1.3.2005, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 1.4.2004

Репутация: нет
Всего: нет



Нет, у меня в main только одна строка auxMainLoop(Draw)
Добавлено @ 12:41
Дело в том, что в Draw по инкременту перерисовывается некий объект, скорость перерисовки зависит от приращения. А я хочу чтобы он перерисовывался по таймеру smile
PM MAIL   Вверх
maxim1000
Дата 1.3.2005, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата
мне тогда код программы нужно будет переписывать под апи

а можно поинтересоваться, что это за среда разработки и почему программу придется переписывать под API?

Добавлено @ 12:58
а точнее, что мешает в первой строке программы написать #include <windows.h> и потом пользоваться API-шными функциями?


--------------------
qqq
PM WWW   Вверх
maxim1000
Дата 1.3.2005, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Код

SetTimer(NULL, 0, 40, (TIMERPROC) MyTimerProc);
auxReshapeFunc((AUXRESHAPEPROC)Reshape);
//auxMainLoop(Draw);
return 0;

здесь происходит запуск таймера, а потом почти сразу выход из программы вообще, таймер просто не успевает сработать
нужно зациклить программу (например while(true))


--------------------
qqq
PM WWW   Вверх
decembrist
Дата 2.3.2005, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 1.4.2004

Репутация: нет
Всего: нет



Блин, совсем запутался!
Еще раз
Код

int main (int argc,char **argv)
{
  ...
Init();
  ...
auxReshapeFunc((AUXRESHAPEPROC)Reshape);

SetTimer(NULL, 0, 40, (TIMERPROC) MyTimerProc);

 return 0;
}

где в MyTimerProc() у меня основной код который должен повторяться через определенный интервал времени. Почему он не успевает сработать?
Пробовал maxim1000
while (true)
{
SetTimer(NULL, 0, 40, (TIMERPROC) MyTimerProc);

}
тогда происходит запуск в цикле таймера, а не процедуры MyTimerProc?
PM MAIL   Вверх
maxim1000
Дата 2.3.2005, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



не так
SetTimer(...) всего лишь запускает процесс периодических вызовов
через указанное время процедура будет вызвана
единственное, что нужно - чтобы приложение в этот момент еще не завершилось
поэтому нужно сделать:
Код

SetTimer(...);
while(true);



--------------------
qqq
PM WWW   Вверх
decembrist
Дата 2.3.2005, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 1.4.2004

Репутация: нет
Всего: нет



Спасибо smile , сейчас попробую!
Добавлено @ 13:07
Попробовал, последняя строка while(true); зациклила прогу, а таймер не вызывает ф-цию MyTimerProc? smile

PM MAIL   Вверх
maxim1000
Дата 2.3.2005, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



хм...непонятно...
с одной стороны в MSDN говорится, что необходимо наличие окна для обработки сообщения от таймера хотя бы для того, чтобы автоматически вызвать функцию таймера
Цитата
An application can process WM_TIMER messages by including a WM_TIMER case statement in the window procedure or by specifying a TimerProc callback function when creating the timer. When you specify a TimerProc callback function, the default window procedure calls the callback function when it processes WM_TIMER. Therefore, you need to dispatch messages in the calling thread, even when you use TimerProc instead of processing WM_TIMER

с другой стороны там же (только выше) говорится, что можно обойтись без окна вообще:
Цитата
Handle to the window to be associated with the timer. This window must be owned by the calling thread. If this parameter is NULL, no window is associated with the timer and the nIDEvent parameter is ignored.

Добавлено @ 13:24
или,может,они полагаются на то, что Рабочий стол (0-й handle указывает на него, насколько мне известно) сам обработает это сообщение и вызовет функцию...как-то не верится...
Добавлено @ 13:25
ладно, я все равно обычно пользуюсь ожидаемыми таймерами:
http://msdn.microsoft.com/library/default....mer_objects.asp


--------------------
qqq
PM WWW   Вверх
decembrist
Дата 2.3.2005, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 1.4.2004

Репутация: нет
Всего: нет



Я попробовал так
Код

int main (int argc,char **argv)
{
 ...
Init();
 ...
auxReshapeFunc((AUXRESHAPEPROC)Reshape);

SetTimer(NULL, 0, 40, (TIMERPROC) MyTimerProc);
auxMainLoop(Draw);

return 0;
}

VOID CALLBACK MyTimerProc(
   HWND hwnd,        // handle to window for timer messages
   UINT message,     // WM_TIMER message
   UINT idTimer,     // timer identifier
   DWORD dwTime)     // current system time
{
timeRadar++;
Draw();
}

auxMainLoop(Draw); работает как обработчик сообщения WM_PAINT
то есть вызывает перерисовку созданного мной изображения.
Теперь идет обращение к MyTimerProc().
Но у меня другой глюк всплыл. На SetTimer я устанавливаю разные интервалы временип, а у меня одна скорость smile
PM MAIL   Вверх
maxim1000
Дата 2.3.2005, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



а-а-а-а... как же до меня не дошло сразу...
все предельно просто: надо просто вспомнить, что сообщения приходят не к окнам, а к потокам, которые их создали, а те уже (если захотят, конечно) рассылают их своим окнам
а тут ничего даже рассылать не надо:
Код

#include <windows.h>

void main()
{
 MSG msg;
 SetTimer(0,125,1000,0);
 while(GetMessage(&msg,0,0,0)>0)
 {
   if(msg.message==WM_TIMER)
     MessageBox(0,"timer","timer",MB_OK);//тут можно чего-нибудь вызывать...
   else
   {
     TranslateMessage(&msg);
     DispatchMessage(&msg);
   }
 }
}

Добавлено @ 13:48
ну вот...а тут уже ответили...
http://forum.vingrad.ru/index.php?showtopic=44017&hl=
вот что бывает, когда в двух темах идет обсуждение практически одного вопроса...

Это сообщение отредактировал(а) maxim1000 - 2.3.2005, 13:49


--------------------
qqq
PM WWW   Вверх
decembrist
Дата 2.3.2005, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 1.4.2004

Репутация: нет
Всего: нет



Спасибо,
maxim1000 за помощь.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0549 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.