Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
ВнизStaticText движется рывками Найти похожие ветки
← →
Bulanov © (2004-03-10 20:45) [0]Господа помогите.
У меня такая задача: необходимо реализовать бегущую строку, во время ее движения с некоторой периодичностью на экране будут меняться картинки, подгружаемые из файлов. Впринципе все работает отлично, за исключением того, что во время загрузки картинки моя бегущая строка на мгновение приостанавливается, а это не совсем красиво. Посмотрите пожалуйста код, может я и подход не верный выбрал?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, MPlayer, jpeg;
type
TForm1 = class(TForm)
StaticText1: TStaticText;
Image1: TImage;
VideoPanel: TPanel;
VideoPlayer: TMediaPlayer;
TimerLoadNewImage: TTimer;
procedure FormCreate(Sender: TObject);
procedure TimerLoadNewImageTimer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TRunStringThread = class(TThread)
procedure Execute; override;
procedure MotionRunString;
end;
var
Form1: TForm1;
RunStringThread:TRunStringThread;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
RunStringThread:=TRunStringThread.Create(False);
RunStringThread.Priority := tpHighest;
end;
procedure TRunStringThread.Execute;
var i:Integer;
begin
while true do
begin
Synchronize(MotionRunString);
Application.ProcessMessages;
sleep(5);
end;
end;
procedure TRunStringThread.MotionRunString;
begin
Form1.StaticText1.Left:=Form1.StaticText1.Left-1;
if Form1.StaticText1.Left=-Form1.StaticText1.Width then Form1.StaticText1.Left:=Form1.Width;
end;
procedure TForm1.TimerLoadNewImageTimer(Sender: TObject);
begin
Image1.Picture.LoadFromFile("c:\100.jpg");
end;
end.
← →
YuRock © (2004-03-10 20:52) [1]1. Вместо tpHighest настоятельно рекомендую вписать tpLower;
2. Убрать Application.ProcessMessages;
3. (главное - из-за чего происходит замедление) убрать нафиг Synchronize!!!
← →
Bulanov © (2004-03-10 20:56) [2]А куда же тогда обработку самого движения вставить?
Я имею ввиду MotionRunString
← →
YuRock © (2004-03-10 21:00) [3]Попробуйте заменить
Synchronize(MotionRunString);
на
MotionRunString;
← →
YuRock © (2004-03-10 21:05) [4]А еще желательно заменить
while true do
на
while not Terminated do
и переработать механизм движения (не использовать Left и Width, а использовать MoveWindow и GetClientRect/GetWindowRect)
← →
Bulanov © (2004-03-10 21:05) [5]Сделал все точно так как ты сказал - результат тот=же
← →
YuRock © (2004-03-10 21:32) [6]Верю, что почти тот же. А тормоз потому, что обработка сообщений Static выполняется все-равно в главном потоке, в главном обработчике сообщений. Советую загружать рисунок в доп. потоке, а статик двигать - можно и по таймеру.
Будет намного легче работать. Просто строки
Form1.StaticText1.Left:=Form1.StaticText1.Left-1;
if Form1.StaticText1.Left=-Form1.StaticText1.Width then Form1.StaticText1.Left:=Form1.Width;
и
Form1.Image1.Picture.LoadFromFile("c:\100.jpg");
поменяй местами и интервалы измени (в Sleep и у таймера)
← →
Bulanov © (2004-03-10 22:13) [7]Короче тоже самое, чето я не так видимо делаю.
← →
sniknik © (2004-03-11 00:14) [8]это
Application.ProcessMessages;
в потоке явно лишнее, лутше sleep побольше поставь.
← →
Bulanov © (2004-03-11 01:42) [9]Да мужики точно говорю скоко не ставь, когда начинается загрузка файла, все-равно какого, проверял, будь-то флэш, видео, или картинка, такое чувство, что все системные ресурсы уходят на осуществление загрузки, и на мгновение, где-то пол секунды, все нахрен замирает, ну и разумеется эта извиняюсь за выражение сраная бегущая строка.
← →
Defunct © (2004-03-11 02:24) [10]Работает нормально без передергиваний с маленьким файлом (объем JPG файла на котором тестил составляет 300Kb).
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, MPlayer, jpeg;
type
TForm1 = class(TForm)
StaticText1: TStaticText;
VideoPanel: TPanel;
MediaPlayer1: TMediaPlayer;
Image1: TImage;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TRunStringThread = class(TThread)
Private
FAction : TNotifyEvent;
FSpeed : Integer;
FJob : Integer;
BMP : TPicture;
Procedure DoTheJob;
Procedure ChangePicture;
procedure MotionRunString;
Protected
procedure Execute; override;
Public
Constructor CreateAJob(JobType:Integer;Speed:Integer;TPriority:TThreadPriority);
end;
var
Form1: TForm1;
RunStringThread:TRunStringThread;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
TRunStringThread.CreateAJob(0,5, TpNormal);
TRunStringThread.CreateAJob(1,500, TpIdle);
end;
Procedure TRunStringThread.ChangePicture;
Begin
Form1.Image1.Canvas.Draw(0,0,BMP.Graphic);
End;
procedure TRunStringThread.MotionRunString;
begin
Form1.StaticText1.Left:=Form1.StaticText1.Left-1;
if Form1.StaticText1.Left=-Form1.StaticText1.Width then Form1.StaticText1.Left:=Form1.Width;
end;
Constructor TRunStringThread.CreateAJob;
Begin
FreeOnTerminate := True;
FJob := JobType;
FSpeed:=Speed;
Inherited Create(False);
Priority := TPriority;
End;
Procedure TRunStringThread.DoTheJob;
Begin
Case FJob Of
0:
Begin
Synchronize(MotionRunString);
End;
1:
Begin
BMP := TPicture.Create;
BMP.LoadFromFile("c:\100.jpg");
Synchronize(ChangePicture);
BMP.Free;
End;
End;
End;
procedure TRunStringThread.Execute;
var i:Integer;
begin
while Not Terminated do
begin
Sleep(FSpeed);
DoTheJob;
end;
end;
end.
← →
Defunct © (2004-03-11 02:28) [11]Вывод, уменьшите разрешение JPG рисунка, используйте StretchDraw если нужно перерисовывать весь фон формы.
← →
Bulanov © (2004-03-11 03:01) [12]Базара нет, базара нет!
Спасибо большое, навели на мысль!
Как ни старнно даже мегобайтный BMP загружается влегкую, и ничего не тормозит. А вот 100 килобайтный JPG обтормаживает все напрочь. Математика распаковки видимо тормозит я так понимаю?
Ну впринципе проблема более-менее решена.
← →
Defunct © (2004-03-11 03:19) [13]> Математика распаковки видимо тормозит я так понимаю?
Да похоже на то, и плюс без Synchronize там не обойтись, отсюда и тормоза..
← →
YuRock © (2004-03-11 10:52) [14]> Defunct © (11.03.04 03:19) [13]
> плюс без Synchronize там не обойтись, отсюда и тормоза
Да, если Synchronize поставить - будут тормоза...
← →
Erik © (2004-03-11 11:28) [15]А если поставить в потоке SendMessage, а в форме принимать и делать MotionRunString. Если загружать jpg и перобразовавать в BMP потоке с приоритетом idle, то Synchronize(ChangePicture) тормозить недолжно.
← →
YuRock © (2004-03-11 11:46) [16]> Erik © (11.03.04 11:28) [15]
Зачем это все? Если рисунок (любой) грузить в потоке, и без Synchronize, то тормозить не будет ни грамма! (я имею в виду движение бегущей строки - что хочет автор)
← →
Petrovitch (2004-03-11 12:02) [17]Плюнь на все и воспользуйся компанентой бегущей строки и, ... прочей ерундой.
Если хочешь - вышлю
в zipe 2,5 Mb
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.032 c