Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.14;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.026 c
2-1189617829
Kley
2007-09-12 21:23
2007.10.14
Чистка БД от задвоек


2-1190014526
~ShamaN~
2007-09-17 11:35
2007.10.14
Странности с модальной формой


2-1190181588
foma_nk
2007-09-19 09:59
2007.10.14
Format


3-1181285199
ssa
2007-06-08 10:46
2007.10.14
Узнать, что dataset находится в режиме редактирования


2-1190303313
webpauk
2007-09-20 19:48
2007.10.14
Наследие