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

Вниз

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

Наверх




Память: 0.51 MB
Время: 0.024 c
1-1078905860
Аноним
2004-03-10 11:04
2004.03.28
Threads


14-1077941184
Oyster
2004-02-28 07:06
2004.03.28
Декомпилятор


14-1078234550
Asd
2004-03-02 16:35
2004.03.28
Книги


3-1077283585
Storg
2004-02-20 16:26
2004.03.28
Помогите с DBChart?


7-1073270354
Babay
2004-01-05 05:39
2004.03.28
Очередь печати принтера