Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.17;
Скачать: CL | DM;

Вниз

Основной код приложния с ттаймером...   Найти похожие ветки 

 
SkyRanger ©   (2003-12-02 03:08) [0]

Не подскажите нормальный код win API приложения, чтобы он по-человечески работал с таймером у меня сейчас сделанно так:
//Задаем размеры окна
WinHeight:=400;
WinWidth:=400;
WinTop:=100;
WinLeft:=100;
CreateMyWnd; //Создаем окно и получаем дискриптор
// Для уверенности что окно будет после запуска поверх остальных
ShowWindow(mywnd, SW_SHOW);
//Пока не будет посланно сообщение 0 программа будет работать
IsFinish := False;
while not IsFinish do
begin
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
if Msg.Message = WM_QUIT then
IsFinish := True
else
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end
else
begin
FPSCnt:=FPSCnt+1; // Увеличиваем счетчик FPS
end;

WinPaint(); // Прорисовываем окно
// Если нажата ESC на выход
if (keyBuf[VK_ESCAPE]) then
IsFinish := True;
HandleKeys(); // обрабатываем нажатия клавишь

end;

//Освобождение памяти
FreeMem;
KillTimer(mywnd, timer_id);
UnRegisterClass(ClassName,hInstance);


Код окна соответственно:
{ MyWndProc
Функция обработки главного окна программы. }

function MyWndProc(wnd: hWnd; msg, wParam, lParam: longint): longint; stdcall;
var
s : string;
begin
case msg of
WM_CREATE : // Инициализация при создании окна
begin
OnWindowCreate(wnd,WinHeight,WinWidth,WinTop,WinLeft);
end;

WM_MOVE : begin // Изменение положения при перемещении окна
WinTop := LOWORD(lParam);
WinLeft:= HIWORD(lParam);
end;

WM_SIZE:begin // На случай изменения размеров окна
OnWinResize(LOWORD(lParam),HIWORD(lParam));
end;

WM_DESTROY: // Выход из программы
begin
PostQuitMessage(0);
result := 0;
end;

WM_TIMER: // Периодическое обновление окна
begin
if wparam = 1 then // Обновление счетчика FPS
begin

str(FPSCnt,s);
SetWindowText(mywnd, PChar(WindowTitle+" Demo FPS : " + s));
FPSCnt := 0;
Result := 0;
end;

end;

WM_KEYDOWN : // При нажатии клавиши отмечаем ее
begin
keyBuf[wParam] := True;
Result := 0;
end;
WM_KEYUP: // Когда клавиша отжата отмечаем это
begin
keyBuf[wParam] := False;
Result := 0;
end;
else
result := DefWindowProc(wnd, msg, WParam, LParam);
end;
end;


После того, как я поменял дома Geforce 2 MX 400 на ATI RADEON 9600 Pro У меня FPS зашкаливает за 999 и скорость ненормальная, хотя на Geforce 2 MX 400 все вроде достаточно медленно. Так что нужен код, чтобы он давал отсечку от таймера нормально, и перерисовка происходила СТРОГО через отмерянные промежутки времени...


 
BiN ©   (2003-12-02 10:23) [1]

интересно, а как у тебя сочетаются команды

ShowWindow(mywnd, SW_SHOW);
и
KillTimer(mywnd, timer_id);


 
SkyRanger ©   (2003-12-03 04:28) [2]

А они и не сочитаются... Это останки от предыдущего кода и находится все енто щастье перед end.


 
BiN ©   (2003-12-03 10:36) [3]

procedure MySuperPuperTimerProc(H:HWND;MSG:UINT;idTimer:UINT;dwTime:DWORD); stdcall;
begin
//Делай чо хошь
end;

Var
TimerID:UINT;
MyHWND:HWND;
begin
TimerID:=123;

MyWnd:=CreateMyWnd;// не забудь определить WNDProc для своего окна
SetTimer(MyWnd, TimerID, MyTimerInterval,MySuperPuperTimerProc);
repeat
///Обрабатывай сообщения
until ...
...
killtimer(TimerID);
...
end;


 
SkyRanger ©   (2003-12-04 07:21) [4]


procedure MyTimerProc(H:HWND;MSG:UINT;idTimer:UINT;dwTime:DWORD); stdcall;
begin

WinPaint(); // Прорисовываем окно
// Если нажата ESC на выход
if (keyBuf[VK_ESCAPE]) then
IsFinish := True;
HandleKeys(); // обрабатываем нажатия клавишь
//Делай чо хошь
end;

SetTimer(mywnd, timer_id, 1000, @MyTimerProc);


Вот так сдеал, но результат плачевный, началися такие тормоза аж жуть... А если по-старому все ОК!


 
BiN ©   (2003-12-04 09:16) [5]

ага конечно у тебя 1 кадр в секунду (1000 = 1000миллисекунд = 1 сек)


 
SkyRanger ©   (2003-12-04 09:19) [6]

Ну ставил я 1, пофигу! Все равно притормаживает сволоч!


 
BiN ©   (2003-12-04 09:26) [7]

минимально ты можешь ставить где-то 55-60 - экспериментируй

если у тебя везде GetLastError равен нулю, значит, в плане таймера ты все сделал ок. А тормоза - это, скорее, проблема твоих алгоритмов


 
BiN ©   (2003-12-04 09:58) [8]

Кстати, я совсем забыл - ты же с графикой работаешь. В твоем случае лучше все-таки использовть GetTickCount для определения интервалов между кадрами


 
SkyRanger ©   (2003-12-15 08:45) [9]

Блин.... Че то меня клинит... Подскажите пример использования GetTickCount сколько там лучше задержку поставить чтобы FPS был на уровне ну скажем 60...



Страницы: 1 вся ветка

Текущий архив: 2004.02.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.022 c
14-53730
Figr
2004-01-28 14:32
2004.02.17
Какое количество оборотов у стандартных 478 кулеров?


3-53431
Avreliy
2004-01-28 14:07
2004.02.17
Округление в FireBird


7-53784
Dark Elf
2003-10-30 12:22
2004.02.17
Программирование кассовых аппаратов


3-53361
pp
2004-01-27 12:28
2004.02.17
Можно ли динамически создавать/удалять View в Интербейзе?


3-53394
chtr
2004-01-27 09:21
2004.02.17
Фильтрация по выбору из DBLookupCombobox