Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-1077798220
Dron
2004-02-26 15:23
2004.03.28
Interbase: как создать представление(вид) из хр. процедуры?


14-1077850939
Думкин
2004-02-27 06:02
2004.03.28
С днем рождения! 27 февраля.


4-1073987601
_lordtime_
2004-01-13 12:53
2004.03.28
Есть ли возможность узнать время старта Windows?


14-1078330481
Piton_Sk
2004-03-03 19:14
2004.03.28
Кто качал TestsEdit Clift или знает e-mail автора


4-1074440872
xamlo
2004-01-18 18:47
2004.03.28
работа с реестром?





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