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

Вниз

Обновление показателя времени   Найти похожие ветки 

 
TsvIlya   (2003-12-12 12:25) [0]

На форме лежит таймер, который кождые 10 миллисек обновляет покания времени (рисует на paintbox, кстати на чам быстрее отрисовка? (но не на самой форме)). Когда я запускаю прогу из-под delphi и двигаю мышь (!!!) отрисовка происходит быстрее (чаще), причем это видно невооруженным глазом... Если я не двигаю мышь (опять же !!!) или запскаю прогу не из среды, то обновления времени происходят явно не каждые 10 миллисекунд... Как мне лучше добиться реального обновления? И причем тут мышь???
Заранее спасибо!
С уважением, TsvIlya.


 
Sandman25   (2003-12-12 12:27) [1]

ЗАчем показывать время каждые 10мсек?
Инертность человеческого глаза в среднем около 100мсек.


 
TsvIlya   (2003-12-12 12:35) [2]

Прога для работы с музыкой. Кстати инертность глаза 40мс - 25 кадров в секунду... Он тормазит и при 40...


 
Sandman25   (2003-12-12 12:38) [3]

[2] TsvIlya © (12.12.03 12:35)

Это все, конечно, хорошо. Но все-таки зачем показывать человеку время каждые 10 мсек? Вы мерцание экрана при 100Гц замечаете?


 
Aleksey   (2003-12-12 12:57) [4]

А зачем тебе вобще рисовать? Не проще ли будет вывести его в Label


 
TsvIlya   (2003-12-12 18:54) [5]

> Sandman25 © (12.12.03 12:38)
Я нет... :) Но если ставить через каждые 40мс он же тоже тормазит. К тому же я еще и узуковой спектр вывожу - разница с тормазами и без тоже замента невооруженным глазом...

Люди, ну кто-нибудь, помогите... Хоть на мысль на какую-нибудь наведите... Уж больно интересно причем тут мышь...


 
Sandman25   (2003-12-12 18:56) [6]

Windows не дает никаких гарантий, что таймер будет обработан тогда, когда задумано. И чем меньше интервал таймера, тем больше погрешность.


 
Agent13   (2003-12-12 19:05) [7]

>Windows не дает никаких гарантий, что таймер будет обработан тогда, когда задумано. И чем меньше интервал таймера, тем больше погрешность.

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


 
TsvIlya   (2003-12-12 21:53) [8]

Только я так и не понял причем тут может быть мышь...


 
y-soft   (2003-12-12 22:33) [9]

>TsvIlya © (12.12.03 21:53) [8]

Использовать GUI перерисовку каждые 10 мс - худшее, что можно сделать. Использовать для точного измерения TTimer - тоже.
Фактически Вы не учитываете, что:

1. Windows не может так быстро рисовать

2. На разных компьютерах вести себя будет по разному (скорость перерисовки зависит от платформы, объема ОЗУ, частоты CPU и типа видеокарты)

3. Сообщения WM_TIMER обрабатываются с самым низким приоритетом, к тому же, если в очереди сообщений уже есть такое необработанное сообщение, то новое туда не помещается, т.е. возможны пропуски "тиков". Сообщения перерисовки имеют только чуть более высокий приоритет, т.е. будет еще зависеть от того, как пользователь двигает "мышью" и нажимает клавиши

4. В Win9X точность стандартный таймера примерно в 10 раз хуже, чем в WinNT, т.е. будет зависеть еще и от версии ОС

Правильнее будет использовать для измерения времени другие средства - Multimedia Timer, Waitable Timer, измерение тактов CPU, отдельный поток для измерения и т.д.

Если же обязательно нужно, чтобы рисовались значения для 10-мс отсчетов, то можно сделать так: по каждому "тику" таймера накапливать информацию в буфер, и рисовать ее всю сразу по каждому 10-му (лучше 25-му) "тику". Еще вариант - использовать работу с DIB-секциями или DirectX или на худой конец - двойную буферизацию, тогда рисовать можно будет чаще, но и код получится сложнее...


 
TsvIlya   (2003-12-13 09:12) [10]

> y-soft © (12.12.03 22:33)
> Правильнее будет использовать для измерения времени другие средства - Multimedia Timer, Waitable Timer, измерение тактов CPU, отдельный поток для измерения и т.д.

Очень интересно... Где можно почитеть и узнать поподробнее?


 
y-soft   (2003-12-13 09:41) [11]

>TsvIlya © (13.12.03 09:12) [10]

Очень интересно... Где можно почитеть и узнать поподробнее?

Лучший источник - MSDN. Про WatableTimer хорошо и подробно написано у Рихтера. На Torry есть компоненты-оболочки для MultimediaTimer. Измерение тактов CPU для данной задачи наверное излишне точно и приведено лишь в качестве примера...


 
ALEIIIKA   (2003-12-18 14:51) [12]

На самом деле TTimer не может срабатывать быстрее чем 50 мс, это особенности Window"s;
Лови пример мультимедиа таймера:

TForm1 = class(TForm)
...
private
{ Private declarations }
uTimerId : uint;
protected
procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
end;

procedure FNTimeCallBack(uTimerID, uMessage: UINT;dwUser, dw1, dw2: DWORD) stdcall;
begin
InvalidateRect(Handle, nil, False);
end;

procedure TForm1.WMPaint(var Msg: TWMPaint);
begin
// отрисовываешь чего надо
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
uTimerID := timeSetEvent (12, 0, @FNTimeCallBack, 0, TIME_PERIODIC);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
timeKillEvent(uTimerID);
end;


Чуть не забыл:

Uses
MMSystem;



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

Форум: "Основная";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.01 c
1-11967
BlackTiger
2003-12-18 16:23
2004.01.05
Можно ли в ЧУЖОМ MDI-приложении запретить закрытие форм через


6-12026
Natali_I
2003-11-03 11:00
2004.01.05
рассылка почтовых сообщений


1-11929
Керик
2003-12-20 23:00
2004.01.05
Объект Application


3-11810
alienka
2003-12-08 18:08
2004.01.05
adoQuery проблема с update данных


1-11930
ximka
2003-12-20 21:43
2004.01.05
Исполнение файла





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский