Как правильно работать с мультимедийным таймером?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Как правильно работать с мультимедийным таймером?

Сообщение alexey38 » 17.02.2012 06:15:03

B4rr4cuda писал(а):Bupyc вопрос не в мультимедийном таймере, а в методике "общения" с потоками) А именно в массовом использовании PostMessage и SendMessage с AllocateWnd для создания моста между потоками. Это весьма удобно и хорошо использовать в делфи, но на лазаре - это проблема именно ввиду его кроссплатформенности. Данная методика очень "привязывается" и используется везде, где надо и не надо, что потом создает серьезные проблемы. Столкнулся лично, поэтому вопрос "больной".. :) Прошу прощения, если задел чувства или оскорбил.


Мультимедийный таймер использовать совместно с PostMessage и SendMessage не имеет смысла. Для этих целей есть системный таймер, который как раз отсылает Message.
Мультимедийный таймер предназначен как раз для многопоточных задач, когда по нему выполняется некий функционал с заданной периодичностью.
Короче все эти вопросы к архитектуре конкретной программы.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Как правильно работать с мультимедийным таймером?

Сообщение Bupyc » 17.02.2012 10:23:53

Я понимаю, что данная методика обмена данными между не очень. Когда я переводил большой объем своего кода с дельфи на фрипаскаль я с этим сам столкнулся. Хотя, у меня работа с сообщениями была достаточно сильно локализована. Просто вопрос изначально был по теме, которая к кросс платформенности особого отношения не имеет. Соответственно, я счел возможным, дать совет, который к конкретной ситуации вполне подходит. В общем, я соглашусь с alexey38

Короче все эти вопросы к архитектуре конкретной программы.


P.S. Кстати, при всей кривобокости данного механизма, он тем не менее используется и в самом Лазарусе. Например, при работе метода TThread.Synchronize в библиотеке LCL. Причем не только в Windows, но и в Windows Mobile.
Bupyc
постоялец
 
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

Re: Как правильно работать с мультимедийным таймером?

Сообщение Andreich » 17.02.2012 19:14:16

alexey38 писал(а):Мультимедийный таймер использовать совместно с PostMessage и SendMessage не имеет смысла. Для этих целей есть системный таймер, который как раз отсылает Message. Мультимедийный таймер предназначен как раз для многопоточных задач, когда по нему выполняется некий функционал с заданной периодичностью. Короче все эти вопросы к архитектуре конкретной программы.

С мультимедийным таймером пока не разобрался до конца (никак не удается синхронизировать потоки), а вот системный работает четко и без сбоев, хотя субъективно несколько медленнее мультимедийного.
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Re: Как правильно работать с мультимедийным таймером?

Сообщение alexey38 » 17.02.2012 19:53:40

Andreich писал(а):С мультимедийным таймером пока не разобрался до конца (никак не удается синхронизировать потоки), а вот системный работает четко и без сбоев, хотя субъективно несколько медленнее мультимедийного.


1. Потоки выполняются паралельно, многозадачность вытесняющая (т.е. при малом числе ядер процессора прерывание кода может произойти в любом месте, в т.ч. посреди оператора).
2. Для передачи данных между потоков нужно использовать CriticalSection, которые блокируют другому потоку (останавливают его выполнение или выдают признак блокировки) доступ к общей памяти на время пока другой поток их смотрит или читает.
3. Для сигнализации межу потоками лучше использовать объекты ядра Event, Mutex и т.п. Они работают четко как часы.
4. Сообщения (Message) - это потоковая технология, никакой четкости синхронизации она не обеспечивает.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 238

Рейтинг@Mail.ru