Форум: "Начинающим";
Текущий архив: 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