Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятки с таймером 
:(
    Опции темы
Nemesis
Дата 18.3.2006, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем привет!!!

Встал в ступор, проблема следующая:

Создаю я таймер, как обычно, но ничего не происходит по прошествию отведенного времени, вообще не пойму в чем дело, вот урезаный код:

Код

#include <windows.h>
#include "InitGL.h"

#define IDT_TIMER1        1    // таймер для произведения вычислений

// Global Variables:
HWND        hWnd;        // handle окна
HINSTANCE    hInst;        // instance окна
RECT                 wndRect;            // размеры и позиция окна
UINT                 idTimer;              // id таймера
OpenGL        gl;                      // объект OpenGL

ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);

void CALLBACK TimerProc(HWND hWnd,UINT iMsg,UINT iTimerID,DWORD dwTime);

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_KEYDOWN:
        gl.Keyboard(wParam, 0, 0);
        switch (wParam)
                  {
        case VK_ESCAPE:
            PostQuitMessage(0);
            break;
        default:
            break;
                  }
        break;
    case WM_PAINT:
        gl.Display();
        break;
    case WM_TIMER:       // пытаемся поймать таймер (1ый способ)
        switch(wParam)
        {
        case IDT_TIMER1:
            gl.Idle();
            break;
        default:
            break;
        }
        break;
    case WM_SIZE:
        GetWindowRect(hWnd, &wndRect);
        gl.Reshape(wndRect.right - wndRect.left, wndRect.bottom - wndRect.top);
        InvalidateRect(hWnd, &wndRect, FALSE);
        break;
    case WM_CREATE:
        gl.init_gl(hWnd);
        gl.MainInit(hWnd);
        idTimer = SetTimer(hWnd, IDT_TIMER1, 100, (TIMERPROC)TimerProc);         // ставим таймер
        break;
    case WM_DESTROY:
        KillTimer(hWnd, idTimer);
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

void CALLBACK TimerProc(HWND hWnd,UINT iMsg,UINT iTimerID,DWORD dwTime) // пытаемся поймать таймер (2ой способ)
{
    int al;
    al = 0;
}


В чем может быть дело???

Это сообщение отредактировал(а) Nemesis - 18.3.2006, 20:44
--------------------
PM MAIL   Вверх
Romikgy
Дата 18.3.2006, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Имхо ставится либо процедура, либо
Цитата(Nemesis @ 18.3.2006, 19:43 Найти цитируемый пост)
WM_TIMER

ловишь,
это первое,
а второе у тя ниче нигде не выполняется, что ты пытаешься увидеть??
Окромя
Цитата(Nemesis @ 18.3.2006, 19:43 Найти цитируемый пост)
gl.Idle();

что это за ф-ция неизвестно


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Fixin
Дата 18.3.2006, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Цитата(Romikgy @ 18.3.2006, 21:32 Найти цитируемый пост)
Имхо ставится либо процедура, либо
Какое ИМХО? smile МСДН!
Цитата(MSDN)
If lpTimerFunc is NULL, the system posts a WM_TIMER message to the application queue
Так что, gl.Idle(); придется совать в коллбеку.

PM MAIL ICQ   Вверх
Nemesis
Дата 18.3.2006, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ок, объясню по порядку. Я делал сначала первый вариант (2ой коментился и ставился NULL в (TIMERPROC), затем пробовал 2ой вариант - коментился WM_TIMER. Ни тот ни др не работал, в функциях я ставил break и туда ничего не попадало.
--------------------
PM MAIL   Вверх
Fixin
Дата 18.3.2006, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Однако, интересная конструкция... (Для отладки?)
Код
{    
    int al;    
    al = 0;    
}
А это:
Код
InvalidateRect(hWnd, &wndRect, FALSE);
перерисовывает контекст графического вывода окна, ИМХО, к ГЛю не относится, повторяю: ИМХО.
PM MAIL ICQ   Вверх
Romikgy
Дата 18.3.2006, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(Fixin @ 18.3.2006, 21:01 Найти цитируемый пост)
Какое ИМХО? smile МСДН!

Ну не лез я в мсдн, не лез вот и сказал, что имхо!!! smile
Цитата(Nemesis @ 18.3.2006, 19:43 Найти цитируемый пост)
void CALLBACK TimerProc(HWND hWnd,UINT iMsg,UINT iTimerID,DWORD dwTime) // пытаемся поймать таймер (2ой способ)
{
    int al;
    al = 0;
}

А что здесь должно работать?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

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


Бывалый
*


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

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



InvalidateRect(hWnd, &wndRect, FALSE); - заставляет послать WM_PAINT где вызывается мой метод отрисовки.

void CALLBACK TimerProc(HWND hWnd,UINT iMsg,UINT iTimerID,DWORD dwTime) // пытаемся поймать таймер (2ой способ)
{
int al;
al = 0;
}

а тут я ловлю операцию присвоения al = 0; это чисто для отладки, сама функция просто не вызывается вот в чем беда.. ((
--------------------
PM MAIL   Вверх
alkorax
Дата 19.3.2006, 06:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Nemesis @ 18.3.2006, 20:43 Найти цитируемый пост)
idTimer = SetTimer(hWnd, IDT_TIMER1, 100, (TIMERPROC)TimerProc);

Если указан последний параметр, сообщение окну не посылается.
Цитата(MSDN)

lpTimerFunc
[in] Pointer to the function to be notified when the time-out value elapses.
If lpTimerFunc is NULL, the system posts a WM_TIMER message to the application queue.


PM MAIL   Вверх
Nemesis
Дата 19.3.2006, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

If lpTimerFunc is NULL, the system posts a WM_TIMER message to the application queue.


Угу, именно так и делал в начале:

idTimer = SetTimer(hWnd, IDT_TIMER1, 100, NULL);

и пытался ловить WM_TIMER, но ничего не ловилось... Я уже даже не знаю в чем дело(( у кого-нибудь такое бывало?
--------------------
PM MAIL   Вверх
Fixin
Дата 19.3.2006, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Вызывай ghostbusters-ов. Честно говоря, бывает и такое smile попробуй отключить гл (закомментируй строку с определением его класса и все строки с ним).
PM MAIL ICQ   Вверх
Earnest
Дата 20.3.2006, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Не уверена, но что-то 1 в качестве ид-ра таймера мне не нравится. Ты проверял, что SetTimer тебе возвращает 1? Это я про способ, когда ловится WM_TIMER, без TimerProc - вроде в коде все выглядит честно. Проверь, приходит ли WM_TIMER вообще, не конкретизируя ID.


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


Эксперт
****


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

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



совсем на всякий случай - цикл обработки сообщений в порядке?


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


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Цитата(maxim1000 @ 20.3.2006, 19:00 Найти цитируемый пост)
цикл обработки сообщений в порядке?
Судя по приведенному коду - да.
PM MAIL ICQ   Вверх
maxim1000
Дата 20.3.2006, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Fixin @ 20.3.2006, 18:06 Найти цитируемый пост)
Судя по приведенному коду - да.

а что в приведенном коде наводит на такую мысль?
просто как раз самого цикла я и не увидел



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


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Дыыы. Перепутал обработчик с циклом. Да, пусть покажет. Но цикл редко меняется...
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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