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

Вниз

Имплонтация мультимедийного таймера в свой компонент   Найти похожие ветки 

 
Jimmy   (2007-09-19 21:00) [0]

Не подскажите, как имплонтировать мультимедийный таймер в свой компонент? Заранее спасибо.


 
Efir ©   (2007-09-19 21:35) [1]

А тебе зачем. Если с этой задачей может справиться TTimer, то лучше использовать его.


 
Jimmy   (2007-09-19 21:44) [2]

У обычного таймера минимальная задержка в 55 мсек. А мне нужно меньше.


 
Инс ©   (2007-09-19 23:42) [3]


>  [2] Jimmy   (19.09.07 21:44)

А у мультимедийного таймера масса ограничений, в частности, коллбэк выполняется в дополнительном потоке, со всеми вытекающими, а еще можно в MSDN заглянуть, там написано, что в этом коллбэке можно вызывать. А минимальная задержка на платформе NT на нем 10 мс, вам от этого легче?


 
Инс ©   (2007-09-20 00:43) [4]


> У обычного таймера минимальная задержка в 55 мсек. А мне
> нужно меньше.

Кстати, у USER-таймера на NT тоже 10 мс. Это на 9x 55


 
homm ©   (2007-09-20 07:19) [5]

> [3] Инс ©   (19.09.07 23:42)
> А минимальная задержка на платформе NT на нем 10 мс

Это у кого, у мультимедиа? Врешь и не краснеешь.


 
Сергей М. ©   (2007-09-20 08:14) [6]


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


Примерно так как и обычный таймер "имплАнтирован" в компонент TTimer.
Исходники компонента доступны.


 
Инс ©   (2007-09-20 10:36) [7]


> Врешь и не краснеешь.

Любой объект-таймер (юзер-таймер, мультимедиа-таймер, ожидаемый таймер) работает через единственный системный таймер, который генерирует аппаратные прерывания на системах NT с частотой 10 мс. По этому прерыванию управление получает планировщик, который выполняет все необходимые действия, связанные с планированием потоков, которые также включают в себя обработку объектов-таймеров. Это разрешение в 10 мс можно изменить с помощью timeBeginPeriod, однако я не рекомендовал бы это делать, так как это скажется на всей системе, в частности, изменится величина кванта, выделяемая потокам, что может отрицательно сказаться на производительности системы.


 
Jimmy   (2007-09-20 10:43) [8]

Спасибо за советы! Но вот появилась еще одна проблемка. Когда я включаю имплантированный таймер во время работы программы - все работает, когда же это делаю на этапе разработки в инспекторе объектов, появляется ошибка. Почему это может быть? Или без кода не скажешь?


 
Инс ©   (2007-09-20 10:46) [9]


> Jimmy   (20.09.07 10:43) [8]

Скажу. Потому что вы пытаетесь вызвать в DesignTime обработчик события OnTimer. Не делаете проверку, мы сейчас в дизайн-тайм или ран-тайм. Угадал? Плюс, уверен, вы не учли то, что я сказал насчет потоков, нет никакой синхронизации.


 
Jimmy   (2007-09-20 10:52) [10]

Я - новичок. Не подскажите, как сделать эту проверку?


 
Сергей М. ©   (2007-09-20 11:01) [11]

if csDesigning in ComponentState then


 
Jimmy   (2007-09-20 11:05) [12]

Где вставить эту проверку и как все же пользоваться таймером в DesignTime?


 
Сергей М. ©   (2007-09-20 11:34) [13]


> Где вставить эту проверку


В той процедуре, где ты пытаешься запустить таймер.


> как все же пользоваться таймером в DesignTime?


Зачем тебе нужен работающий таймер в дизайн-тайм ? Поясни ..


 
Anatoly Podgoretsky ©   (2007-09-20 11:42) [14]

> Jimmy  (20.09.2007 11:05:12)  [12]

Там где происходит ошибка.
В DesignTime пользоваться таймером не надо.


 
Jimmy   (2007-09-20 11:51) [15]

В RxGifAnimator например ведь можно сделать анимацию в DesignTime. Я делаю бегущую строку. Было бы неплохо чтобы она бежала и в DesingTime?


 
Инс ©   (2007-09-20 11:54) [16]


> Я делаю бегущую строку.

Да, тут конечно юзер-таймером никак не отделаешься :))) Код показывай!


 
Сергей М. ©   (2007-09-20 11:55) [17]

Ты уж определись наконец, какой компонент ты разрабатываешь - то ли компонент-"бегущую строку", то ли компонент-таймер.

А заодно задумайся, за каким лешим тебе понадобился именно мультимедийный таймер и чем не устраивает обычный.


 
Сергей М. ©   (2007-09-20 11:57) [18]


> У обычного таймера минимальная задержка в 55 мсек. А мне
> нужно меньше


Неужели для анимации строки 18 кадров в секунду недостаточно ?)


 
clickmaker ©   (2007-09-20 11:57) [19]


> и чем не устраивает обычный

медленно бежит, наверно )


 
Jimmy   (2007-09-20 11:58) [20]

type
  TDiDRunString = class(TGraphicControl)
  private
    FActive: Boolean;
    FInterval: integer;
    FTimer: TTimer;
    FOnTimer: TNotifyEvent;
    FCaption : string;
    FKRgn : HRgn;
    procedure SetActive(Value: Boolean);
    procedure SetInterval(Interval: integer);
    procedure Timer(Sender: TObject);
    procedure SetCaption(Value: string);
    procedure FreeRegion;
  protected
    procedure Paint; override;
    procedure DrawMain;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Interval: integer read FInterval write SetInterval;
    property Active: Boolean read FActive write SetActive;
    property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
    property Caption: string read FCaption write SetCaption;
    property Enabled;
    property Font;
    property ParentFont;
    property ParentShowHint;
    property ShowHint;
    property Visible;
    property OnClick;
  end;

Var XX:Integer;

procedure Register;

implementation
{------------------------------------------------------------------------------}
procedure Register;
begin
RegisterComponents("DiD", [TDiDRunString]);
end;
{------------------------------------------------------------------------------}
constructor TDiDRunString.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := [csClickEvents,csCaptureMouse];
XX:=0;
Width := 150;
Height := 20;
FKRgn := 0;
FActive:=False;
if not (csDesigning in ComponentState) then
  try
  FTimer := TTimer.Create(self);
  FTimer.Enabled := false;
  FTimer.Interval := FInterval;
  FTimer.OnTimer := Timer;
  except
  FreeAndNil(FTimer);
  end;
end;
destructor TDiDRunString.Destroy;
begin
if FKRgn <> 0 then FreeRegion;
if Assigned(FTimer) then FreeAndNil(FTimer);
inherited Destroy;
end;
procedure TDiDRunString.SetInterval(Interval: integer);
begin
 FInterval := Interval;
 if Assigned(FTimer) then
   FTimer.Interval := FInterval;
end;
procedure TDiDRunString.Timer(Sender: TObject);
begin
if Assigned(FOnTimer) then FOnTimer(self);
XX:=XX-1;
DrawMain;
Invalidate;
end;
procedure TDiDRunString.DrawMain;
begin
Canvas.Font.Height:=Font.Height;
Canvas.Font.Name:=Font.Name;
Canvas.Brush.Style:=bsClear;
Canvas.TextOut(XX, 0, Caption);
if XX<Canvas.TextWidth(Caption)*(-1) then XX:=Width;
end;
procedure TDiDRunString.FreeRegion;
begin
if FKRgn <> 0 then DeleteObject(FKRgn);
FKRgn := 0;
end;
procedure TDiDRunString.Paint;
begin
inherited Paint;
FreeRegion;
DrawMain;
end;
procedure TDiDRunString.SetCaption(Value: string);
begin
if FCaption=Value then Exit;
FCaption:=Value;
Invalidate;
end;
procedure TDiDRunString.SetActive(Value: Boolean);
begin
if FActive=Value then Exit;
FActive:=Value;
if Not(csDesigning in ComponentState) then FTimer.Enabled:=Value;
Invalidate;
end;
end.


 
Jimmy   (2007-09-20 12:01) [21]

1. Разрабатываю бегущую строку.
2. Не знаю как ее разработать без таймера.
3. 18 кадров=18 пикселей в секунду. Мало!


 
Инс ©   (2007-09-20 12:03) [22]


> 3. 18 кадров=18 пикселей в секунду. Мало!

А кто мешает сделать свойство, задающее шаг - 1 пиксел или 2 или 10?


 
Сергей М. ©   (2007-09-20 12:04) [23]


> procedure TDiDRunString.Timer(Sender: TObject);
> begin
> if Assigned(FOnTimer) then FOnTimer(self);
> XX:=XX-1;
> DrawMain;
> Invalidate;
> end;


Зачем компонент TDiDRunString имеет св-во-событие  OnTimer ?


 
Jimmy   (2007-09-20 12:06) [24]

Шаг = 5 пикселей - некрасивая анимация. Да Бог с ним, с мультимедиа таймером. У меня XP и действительно можно сделать тик равный 10 мсек. Это уже хорошо. Что на счет DesignTime?


 
Инс ©   (2007-09-20 12:07) [25]


> Шаг = 5 пикселей - некрасивая анимация.

При скорости 18 кадров в секунду - никто этого шага не заметит :))


 
Сергей М. ©   (2007-09-20 12:07) [26]


> 18 кадров=18 пикселей в секунду. Мало!


Конечно мало, если в каждом кадре ты умеешь нарисовать всего 18 пикселей)

В одном кадре должно формироваться все изображение той самой строки, а не ее шматок в 18 пикселов !


 
Сергей М. ©   (2007-09-20 12:09) [27]

Похоже в [19] телепатор попал в точку)


 
Сергей М. ©   (2007-09-20 12:16) [28]


> Jimmy


Эдак тебе никикх таймеров не хватит)

Дай тебе таймер с разрешением в 5мс, у тебя возникнет идея-фикс двигать изображение на пол-пикселя за один тик)


 
Jeer ©   (2007-09-20 12:36) [29]


> 3. 18 кадров=18 пикселей в секунду. Мало!
>


На платформах NT 10 ms == 100 Гц ( 100 frame per sec)
Этого за глаза хватит для видимой плавности движения.
При желании можно еще замедлить скролл путем имитации дробного шага
за счет инерционности зрения:

 step := 1; //px
 Inc(i);
 if (i mod 3)=0 then step := - step
 else step := 1;
 *.Left := *.Left + step;


 
homm ©   (2007-09-20 13:10) [30]

> [26] Сергей М. ©   (20.09.07 12:07)
> В одном кадре должно формироваться все изображение той самой
> строки, а не ее шматок в 18 пикселов !

Зато Ваш телепатор сбоит. 18 пикселей, это смещение за секунду, при скорости смещения 1 пиксель в кадр и 18 кадров в секунду.


 
Сергей М. ©   (2007-09-20 13:13) [31]


> homm ©   (20.09.07 13:10) [30]


Да я думал, что он за один тик успевает всего 18 пикселей нарисовать)

А он, оказывается, о сдвиге)


 
clickmaker ©   (2007-09-20 13:14) [32]


> [24] Jimmy   (20.09.07 12:06)

есть такая отличная штука - memory-mapped bitmap. Это когда рисуешь картинку сначала на канве битмапа, а после его целиком шлепаешь, куда надо.
в некоторых контролах это реализовано как DoubleBuffered

Я писал игрушку типа змейка на апи, так она у меня уже при 75мс бегала, как угорелая


 
Jimmy   (2007-09-20 13:53) [33]

Так можно сделать анимацию на этапе DesignTime?


 
Сергей М. ©   (2007-09-20 14:03) [34]


> Jimmy   (20.09.07 13:53) [33]


Можно.

Но лишь после того как ты ответишь на [23]


 
Jimmy   (2007-09-20 14:24) [35]

Не знаю.


 
Сергей М. ©   (2007-09-20 14:25) [36]


> Не знаю


А зачем тогда объявил это событие, раз не знаешь ?


 
Jimmy   (2007-09-20 14:33) [37]

Взял из какого-то примера. Еще толком не разобрался.


 
Сергей М. ©   (2007-09-20 14:34) [38]


> Еще толком не разобрался


Ну тогда убирай его нафих.

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


 
Инс ©   (2007-09-20 14:43) [39]

>[33]-[38]

+1 :))



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

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

Наверх




Память: 0.54 MB
Время: 0.038 c
2-1189955487
олег79
2007-09-16 19:11
2007.10.14
можно ли с помощью диалога OpenDialog открыть не файл а папку?


2-1184309419
zero
2007-07-13 10:50
2007.10.14
Не срабатывает метод insert в Query


2-1189832773
vegarulez
2007-09-15 09:06
2007.10.14
Вопрос про Button.Free


2-1189796974
AlRal
2007-09-14 23:09
2007.10.14
Поставить один GroupBox над другим


2-1189838762
hgd
2007-09-15 10:46
2007.10.14
Поиск по базе





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