Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает таймер 
:(
    Опции темы
Fox_in
Дата 6.5.2007, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Устанавливаю новый таймер с помощью setTimer, но при этом сообщение WM_TIMER не генерируется.
Код

const
  idTimer = 101; // идентификатор таймера
  p = 10; // период таймера
var
  hWindow : HWND; // дескриптор окна

function windowProc(HWND : HWND; MSG : UINT; WPARAM : WPARAM; LPARAM : LPARAM) : LRESULT;STDCALL;
begin
  result := 0;
  case MSG of
    WM_CREATE :  begin
                              с := 0;
                              setTimer(hWindow,idTimer,p,nil);
                              end;
    WM_TIMER : c := c + 1; // просто увеличивается переменная
{...}


Может я что-то не так делаю??
PM MAIL   Вверх
Snowy
Дата 6.5.2007, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Значит что-то делаешь неправильно...
Могу только гадать.
Например в hWindow неверное значение.
Попробуй заменить его на HWND.

Добавлено через 2 минуты и 13 секунд
ЗЫ. Не очень хорошае идея использовать имя параметра идентичное типу.
ЗЫЗЫ. Ести таймер не ставится, то GetLastError расскажет почему.
PM MAIL   Вверх
anwe
Дата 6.5.2007, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Посмотри на возвращаемое значение setTimer. Если установка таймера прошла нормально, то вернется его ID. Если нет - 0.
PM MAIL   Вверх
Voyager
Дата 7.5.2007, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Проверь
setTimer(HWND,101,100,nil);
PM   Вверх
Fox_in
Дата 7.5.2007, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ничего так и не помогло. Решил использовать getTickCount -- по крайней мере, точнее получается.

Цитата

ЗЫ. Не очень хорошае идея использовать имя параметра идентичное типу.

знаю, но так удобнее. Конфликтов пока не возникало.
PM MAIL   Вверх
Yanis
Дата 7.5.2007, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Давай сюда весь код или тестовое приложение.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
aktuba
Дата 7.5.2007, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

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



Цитата

знаю, но так удобнее. Конфликтов пока не возникало. 


Чем удобнее то???  smile 


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Fox_in
Дата 9.5.2007, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
Давай сюда весь код или тестовое приложение. 

вот. При левом клике происходит переключение -- ручное управл./таймер .

Цитата
Чем удобнее то???

нужно запоминать, что как объявлено. А в проекте и так уже 20 переменных. В принципе, можно поменять. На всякий случай.

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  sample.rar 14,60 Kb
PM MAIL   Вверх
aktuba
Дата 9.5.2007, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

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



Цитата

нужно запоминать, что как объявлено.


 smile Нужно не запоминать, а называть правильно... На эту тему есть ОГРОМНАЯ масса инфы в сети!!! А вот называть переменные названиями типов - очень неправильно! Особенно, если потом будешь развивать программу или, что еще хуже, если это будет делать кто-то другой...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
ama_kid
Дата 10.5.2007, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

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



Fox_in, что же ты сразу не сказал, что работаешь с OpenGL? Тебя бы сразу переместили в соответствующую тему... Совет - забудь про использование системного таймера в этом случае - его сообщение WM_TIMER является низкоприоритетным и посылается окну только при отстутствии других сообщений, в твоем же случае очередь заполняется WM_PAINT. Имхо лучше использовать высокоточный счетчик, например так (я не говорю, что именно так - просто в качестве твоего переработанного примера):
Код
program openGL_api;

uses
  Windows,
  Messages,
  OpenGL;

const
  idTimer = 10004;
  period = 30;
  steps = 100;                // max i
  n = 100;                    // max k

type
 TQueryTimer = record
   frequency:int64;
   performance_timer:boolean;
   resolution:double;
   performance_timer_elapsed:int64;
   performance_timer_start:int64;
 end;

var
  hWindow : HWND;
  MSG : TMSG;
  wndCls : TWndClassEx;
  rc : HGLRC;
  dc : HDC;
  screenX,screenY,t,p,i,k : integer;
  angleX,angleY,z,c : GLfloat;
  smooth,m : boolean;
  top,bottom,left,right,zNear,zFar : GLfloat;
  mode : cardinal;
  timer:TQueryTimer;
  current_time: double = 0.0;
  m_dwLastTime:double = 0.0;

procedure OnTimer;
begin
    angleY := angleY + 1;
    p := t;
end;

function windowProc(HWND : HWND; MSG : UINT; WPARAM : WPARAM; LPARAM : LPARAM) : LRESULT;STDCALL;
var
 r:cardinal;
begin
  result := 0;
  case MSG of
    WM_CREATE :   begin
                    screenX := getSystemMetrics(SM_CXSCREEN);
                    screenY := getSystemMetrics(SM_CYSCREEN);
                    left := -2*getSystemMetrics(SM_CXSCREEN)/getSystemMetrics(SM_CYSCREEN);
                    right := 2*getSystemMetrics(SM_CXSCREEN)/getSystemMetrics(SM_CYSCREEN);
                    bottom := -2;
                    top := 2;
                    zNear := 1;
                    zFar := 1000;
                    angleX := 0;
                    angleY := 0;
                    z := -3;
                    t := getTickCount;
                    p := t;
                    c := 30;
                    m := true;
                    end;
    WM_DESTROY :  begin
                    wglDeleteContext(rc);
                    deleteDC(dc);
                    postQuitMessage(0); // postMessage(HWND,WM_QUIT,WPARAM,LPARAM);
                    exit;
                    end;
    WM_KEYDOWN :  begin
                    case WPARAM of
                      $1B : begin
                              sendMessage(hWindow,WM_SYSCOMMAND,SC_CLOSE,0);
                              end;
                      $26 : begin
                              z := z - 0.1;
                              end;
                      $28 : begin
                              z := z + 0.1;
                              end;
                      $20 : begin
                              smooth := not smooth;
                              end;
                      $74 : begin

                              end;
                      end;
                    end;
    WM_MOUSEMOVE: begin
                    if m then begin
                      angleY := 180*(2*loword(LPARAM)/screenX-1);
                      angleX := 180*(2*hiword(LPARAM)/screenY-1);
                      end;
                    end;
    WM_LBUTTONDOWN: begin          // áëîêèðîâêà óïðàâëåíèÿ; îáðàáàòûâàåòñÿ òàéìåð
                      m := not m;
                      end;
    WM_RBUTTONDOWN: begin
                      smooth := not smooth;
                      end;
    WM_MOUSEWHEEL:begin
                    if (WPARAM > 0) then
                      z := z - (ln(abs(z))/ln(100))
                    else
                      z := z + (ln(abs(z))/ln(100));
                    end;
    WM_PAINT :    begin

                    wglMakeCurrent(dc,rc);
                    glViewPort(0,0,getSystemMetrics(SM_CXSCREEN),getSystemMetrics(SM_CYSCREEN));

                    // glPushMatrix;
                    glLoadIdentity;
                    glFrustum(left,right,bottom,top,zNear,zFar);

                    glTranslatef(0,0,z);
                    glRotatef(angleX,1.0,0.0,0.0);
                    glRotatef(angleY,0.0,1.0,0.0);

                    glClearColor(0,0,0,1);
                    glClear(GL_COLOR_BUFFER_BIT);

                    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
                    if smooth then
                      glEnable(GL_LINE_SMOOTH)
                    else
                      glDisable(GL_LINE_SMOOTH);
                    glColor3f(0.3,0.5,0.7);
                    glLineWidth(2);
                    glBegin(GL_LINES);
                      glVertex3f(-2.0, 0.0, 0.0);
                      glVertex3f( 2.0, 0.0, 0.0);
                      glVertex3f( 0.0,-2.0, 0.0);
                      glVertex3f( 0.0, 2.0, 0.0);
                      glVertex3f( 0.0, 0.0,-2.0);
                      glVertex3f( 0.0, 0.0, 2.0);

                      for i := 1 to 50 do begin
                        glVertex3f( 2.0, 0.0, 0.0);
                        glVertex3f( 1.9,(cos(pi*i/25))/20,(sin(pi*i/25))/20);
                        glVertex3f( 0.0, 2.0, 0.0);
                        glVertex3f((cos(pi*i/25))/20, 1.9,(sin(pi*i/25))/20);
                        glVertex3f( 0.0, 0.0, 2.0);
                        glVertex3f((cos(pi*i/25))/20,(sin(pi*i/25))/20, 1.9);
                        end;

                      glVertex3f( 1.9, 0.4,-0.1); // X
                      glVertex3f( 1.9, 0.1,-0.3);
                      glVertex3f( 1.9, 0.1,-0.1);
                      glVertex3f( 1.9, 0.4,-0.3);

                      glVertex3f( 0.1, 1.9, 0.1); // Y
                      glVertex3f( 0.2, 1.9,0.25);
                      glVertex3f( 0.3, 1.9, 0.1);
                      glVertex3f( 0.2, 1.9,0.25);
                      glVertex3f( 0.2, 1.9,0.25);
                      glVertex3f( 0.2, 1.9, 0.4);
                    glEnd;
                    glBegin(GL_LINE_STRIP);
                      glVertex3f( 0.1, 0.4, 1.9); // Z
                      glVertex3f( 0.3, 0.4, 1.9);
                      glVertex3f( 0.1, 0.1, 1.9);
                      glVertex3f( 0.3, 0.1, 1.9);
                      glEnd;

                    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
                    glColor4f(0.4,0.7,0.5,0.5);
                    glLineWidth(1);
                    glBegin(GL_QUADS);  // near
                      glNormal3f( 0.0, 0.0,-1.0);
                      glVertex3f(-1.0, 1.0, 1.0);
                      glVertex3f( 1.0, 1.0, 1.0);
                      glVertex3f( 1.0,-1.0, 1.0);
                      glVertex3f(-1.0,-1.0, 1.0);
                      glEnd;
                    glBegin(GL_QUADS);  //right
                      glNormal3f(-1.0, 0.0, 0.0);
                      glVertex3f( 1.0, 1.0, 1.0);
                      glVertex3f( 1.0, 1.0,-1.0);
                      glVertex3f( 1.0,-1.0,-1.0);
                      glVertex3f( 1.0,-1.0, 1.0);
                      glEnd;
                    glBegin(GL_QUADS);  // far
                      glNormal3f( 0.0, 0.0, 1.0);
                      glVertex3f( 1.0, 1.0,-1.0);
                      glVertex3f(-1.0, 1.0,-1.0);
                      glVertex3f(-1.0,-1.0,-1.0);
                      glVertex3f( 1.0,-1.0,-1.0);
                      glEnd;
                    glBegin(GL_QUADS);  // left
                      glNormal3f( 1.0, 0.0, 0.0);
                      glVertex3f(-1.0, 1.0,-1.0);
                      glVertex3f(-1.0, 1.0, 1.0);
                      glVertex3f(-1.0,-1.0, 1.0);
                      glVertex3f(-1.0,-1.0,-1.0);
                      glEnd;
                    glBegin(GL_QUADS);  // top
                      glNormal3f( 0.0,-1.0, 0.0);
                      glVertex3f( 1.0, 1.0, 1.0);
                      glVertex3f(-1.0, 1.0, 1.0);
                      glVertex3f(-1.0, 1.0,-1.0);
                      glVertex3f( 1.0, 1.0,-1.0);
                      glEnd;
                    glBegin(GL_QUADS);  // bottom
                      glNormal3f( 0.0, 1.0, 0.0);
                      glVertex3f( 1.0,-1.0, 1.0);
                      glVertex3f(-1.0,-1.0, 1.0);
                      glVertex3f(-1.0,-1.0,-1.0);
                      glVertex3f( 1.0,-1.0,-1.0);
                      glEnd;

                    // glPopMatrix;

                    swapBuffers(dc);
                    wglMakeCurrent(0,0);
                    end;
  else
    result := defWindowProc(HWND,MSG,WPARAM,LPARAM);
  end;
end;

procedure setDCPixelFormat;
var
  pfd : TPixelFormatDescriptor;
  p : integer;
begin
  dc := getDC(hWindow);
  fillChar(pfd,sizeof(tagPIXELFORMATDESCRIPTOR),0);
  pfd.dwFlags := PFD_DOUBLEBUFFER or PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_GENERIC_ACCELERATED;
  p := choosePixelFormat(dc,@pfd);
  setPixelFormat(dc,p,@pfd);
  rc := wglCreateContext(dc);
end;

procedure TimerInit;
begin
 ZeroMemory(@timer,sizeof(TQueryTimer));
 if QueryPerformanceFrequency(timer.frequency) then
  begin
   QueryPerformanceCounter(timer.performance_timer_start);
   timer.performance_timer:=true;
   timer.resolution:= 1.0/timer.frequency;
   timer.performance_timer_elapsed  := timer.performance_timer_start;
  end;
end;

function TimerGetTime:double;           // Âçÿòü âðåìÿ â ìèëëèñåêóíäàõ
var
 time:int64;
begin
    if (timer.performance_timer) then// Åñòü âûñîêîòî÷íûé òàéìåð?
     begin
        QueryPerformanceCounter(time);
        Result:=(time - timer.performance_timer_start) * timer.resolution * 1000.0;
     end
     else
        result:=0
end;

begin
  with wndCls do begin
    cbSize := sizeof(tagWNDCLASSEXA);
    style := CS_VREDRAW or CS_HREDRAW;
    lpfnWndProc := @windowProc;
    cbClsExtra := 0;
    cbWndExtra := 0;
    hInstance := HINSTANCE;
    hIcon := loadIcon(0,IDI_APPLICATION);
    hCursor := loadCursor(0,IDC_ARROW);
    hbrBackground := COLOR_WINDOW;
    lpszMenuName := nil;
    lpszClassName := 'WND_CLS';
    hIconSm := loadIcon(0,IDI_WINLOGO);
    end;
  registerClassEx(wndCls);

  hWindow := createWindowEx(WS_EX_TOOLWINDOW,'WND_CLS','OpenGL API Application',
                            {WS_SYSMENU or} WS_POPUP,
                            0,0,getSystemMetrics(SM_CXSCREEN),getSystemMetrics(SM_CYSCREEN),
                            0,0,HINSTANCE,nil);

  setDCPixelFormat;

  showWindow(hWindow,SW_SHOW);
  updateWindow(hWindow);
  TimerInit;

  while getMessage(MSG,0,0,0) do begin
    current_time := TimerGetTime;
    if ((current_time - m_dwLastTime)>100.0) and (not m) then 
     begin
      OnTimer;
      m_dwLastTime  := current_time;
     end;
    translateMessage(MSG);
    dispatchMessage(MSG);
    end;

  halt(MSG.wParam);

end.



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

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


 




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


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

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