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

Вниз

История. MMTimer!!!   Найти похожие ветки 

 
Barloggg   (2006-01-23 10:16) [0]

Откуда мне было знать, что он многозадачный? предупреждать надо... :(
Короче история такова: про ММтимер я знал только то, что он типа более точный. ну и повесил на его тик процедуру отрисовки динамически генерируемого битмапа, который может быть большим, а может быть и маленьким. как получится.
и как начало все глючить...но не сразу, а когда битмап стал большим...
я даже до ручки дошел... во всех процедурах в проге лог начал вести... чуть ли не построчно. вот не доходит процедура до конца и все тут... начинается другая...
откуда же мне было знать, что этот самый ММтимер когда наступает время берет и запускает еще одну копию этой процедуры? которая начинает модифицировать уже начавшийся изменяться битмап и все бабахает.
и пошло в лог файле наслоение одной процедуры на другую... а завершения процедур все нету и нету...

в общем времени и нервов потратил... потом долго обалдевал, когда нашел таки решение и заменил MMTimer на обычный Timer. а потом еще для верности флажок поставил :)

Предупредать блин надо... откуда же мне было знать, что винда действительно многозадачная? :)))
зы, а этот таймер я использовал для сбора сообщений на отрисовку, приходящих от контролов, для того, чтобы отрисовывать их одним махом, а не по мере посылания им сообщений от видны.


 
Thaddy   (2006-01-23 11:22) [1]

The MMTimer is a very accurate timer that uses its own thread and is a kernel process with very high precedence. That"s why you can"t use its timer events/callback to process long routines, it can even stop your machine from responding!:
As stated in the WIN32 API documentation, you should only use it to process short routines. Otherwise a better solution is to use a real thread for multitasking.
See my managed threads package on my website. Within the thread you can use the performance counter to do precise timing.


 
ECM ©   (2006-01-23 11:41) [2]

Да уж... (тоже наступал на эти грабли ... даже несколько раз (склероз наверное))   :))
Я думаю (ИМХО) неправильно было объединять в MCK два таймера (обычный и ММ) в одном компоненте. Слишком у них разное поведение...  

> Откуда мне было знать, что он многозадачный? предупреждать
> надо... :(


MSDN:
timeSetEvent
The timeSetEvent function starts a specified timer event. The multimedia timer runs in its own thread

Тем более в MMTimer есть еще куча полезностей - вместо callback можно управлять событием (Set или Pulse). И однозначно надо добавить в KOL:

     fHandle := timeSetEvent( Interval, Resolution, MMTimerCallback, DWORD( @ Self ),
             Integer( Periodic ) or TIME_CALLBACK_FUNCTION or TIME_KILL_SYNCHRONOUS )

Creating an event with the TIME_KILL_SYNCHRONOUS and the TIME_CALLBACK_FUNCTION flag prevents the event from occurring after the timeKillEvent function is called.

Тогда в Вашем случае (ИМХО) можно было бы использовать его в режиме Periodic = FALSE и по окончании callback-процедуры Запускать таймер снова.


 
Vladimir Kladov   (2006-01-23 16:24) [3]

я объединил, потому что иногда многопоточность здесь особых неприятностей не дает, зато есть возможность вместо бросания на форму другого компонента и перенастройки кода просто включить галочку и быстро посмотреть что получится. Надо было в MCK и bitbtn с обычным button объединить, чтобы тоже иметь возможность легкого перехода от отдного к другому в проекте.


 
Barloggg   (2006-01-24 10:06) [4]

кстати я не пользовался МСК компонентом. а сразу закатил newMMtimer. убрал две буквы здесь, две буквы там и стал таймер обычным.
хмм... в наборе DelphiX есть таймер, который работает как обычный, но является мультимедийным. В его OnTimer еще дополнительно передается некий LagCount то есть число срабатываний таймера когда программа была занята. я прикинул и получилось, что там разом работает два таймера один обычный, который генерирует onTimer а второй мультимедийный, который лишь считает этот самый LagCount.
Лично я был бы очень рад если бы обычный таймер работал также, то есть в конструкторе создавал сразу два и выдавал бы еще и lagcount. Это крайне полезно при анимации. на каком проце не запусти везде будет одинаково.

и вообще неплохо бы претворить в жизнь принцип минимального кол-ва пользовательских компонент. короче все запихать в стандартный набор. а то эта необходимость ребилда... в результате у меня стоит только стандартный набор МСК и все.
кстати ListView хорошо заменяет Stringgrid, пока дело не доходит до записи значений в сетку...


 
SPeller ©   (2006-01-24 10:42) [5]

Barloggg   (24.01.06 10:06) [4]
пока дело не доходит до записи значений в сетку

Это точно :))



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

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

Наверх





Память: 0.47 MB
Время: 0.058 c
2-1161696679
crunk
2006-10-24 17:31
2006.11.12
password


3-1158224830
vodvorezlaya
2006-09-14 13:07
2006.11.12
Подскажите с компонентом TDBEdit и TDBComboBox


2-1161775665
logslava
2006-10-25 15:27
2006.11.12
Как преобразовать String в Array Of Char?


2-1161949911
312kbps
2006-10-27 15:51
2006.11.12
PopupMenu and Handle


2-1161714140
Батя
2006-10-24 22:22
2006.11.12
как перевести обычнай символ в Unicode





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