关于图像文件连续滚动播放读盘停顿问题(200分)

  • 主题发起人 主题发起人 loveno
  • 开始时间 开始时间
L

loveno

Unregistered / Unconfirmed
GUEST, unregistred user!
我正在做一个图片连续滚动播放系统,也就是播音提词系统,其中最主要的功能是要保证播放的连贯性。
现在的问题是,由于图片的个数不定,每张按照1.5M来算,200张就是300M了,所以不能采用动态图片数组的方式了。因为那样内存是个瓶颈。所以我只好将图片都以文件的形式存放在硬盘上,依次读取,并用两个Image构件来显示。
原来采用全内存的方式,播放是非常连冠的。但是采用读取文件的方式后,在更换图片时,就会出现一下停顿,当然这是由于读盘所致。我不知道该采用什么方式来消除读文件造成的停顿,想来可能会有两种方案,一是采用多线程,但是不知道该如何实现,而且我不知道可不可以达到预期的效果;另外是像VCD一样,是不是可以采用预读的方式,这个我也不会。关键就是如何避免读文件和连续播放的矛盾。各位富翁,我第一次提问,请多指教,我会将自己所有的分数如数奉上,谢谢!
 
采用多线程是自然的事情.而所谓的预读其实不太一样,因为VCD那样的预读基本上是可以控制的,而你这里最小的一个单位我想也是一个文件了,相对VCD那种预读单位可以很小的,所以使用多线程是肯定的,否则不可能避免停顿
所谓预读在这里就是在显示的同时,建立另一个线程来读取下一个文件,当然也可以建立一个线程读取很多的文件
采用多线程是必需的同时也肯定可以达到效果的
不过我比较奇怪的是播音提词系统为什么用图片的方式 而且还是BMP
使用文字提示或者JPG什么的我想可能会简单一些
 
我的代码如下:每一张图片都是999×715的,在进行读盘时,由于不是多线程,
当图片比较多时,一般我这里是10张之后,总会有一点停顿。
麻烦您告知应该如何实现多线程读文件。
我尝试创建了一个线程,但是没有效果,还是有停顿。请指教通过多线程应该如何实现。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Buttons;

type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
Timer1: TTimer;
Image1: TImage;
procedure Timer1Timer(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
n:integer;
implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
image1.Top:=image1.Top-1;
//panel1.Top:=panel1.Top-1;
if (image1.top mod 50)=0 then
begin
inc(n);
image1.Picture.LoadFromFile('e:/ppt_'+inttostr((n mod 70)+1)+'.bmp');
//image1.Top:=176;
end;
if image1.Top<0 then image1.Top:=800;
//application.ProcessMessages;

end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
n:=0;
image1.Picture.LoadFromFile('e:/ppt_1.bmp');
timer1.Enabled:=true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
doublebuffered:=true;
end;

end.

窗体文件
object Form1: TForm1
Left = -4
Top = -4
Width = 1032
Height = 770
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object Image1: TImage
Left = 7
Top = 704
Width = 1034
Height = 721
end
object BitBtn1: TBitBtn
Left = 16
Top = 80
Width = 105
Height = 41
Caption = 'BitBtn1'
TabOrder = 0
OnClick = BitBtn1Click
end
object Timer1: TTimer
Enabled = False
Interval = 50
OnTimer = Timer1Timer
Left = 144
Top = 96
end
end
 
不要多线程了,我也在做图形方面的
有DoubleBuffered就行了

交个朋友!!
呵呵
 
后退
顶部