Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.011 c
14-53692
VictorT
2004-01-30 11:13
2004.02.17
Посоветуйте, как перекомпоновать интерфейс.


14-53768
Andryk
2004-01-27 18:46
2004.02.17
HELP! Мож кто знает или умеет сам?


1-53562
Мефодий
2004-02-09 11:05
2004.02.17
Замена Edit.OnChange на свою процедуру


9-53353
prihod
2003-08-05 12:42
2004.02.17
Оцените мою новую игрушку


1-53571
Relaxxx
2004-02-07 19:00
2004.02.17
Проблемка, нужен быстрый TreeView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский