一个关于循环播放的小问题,但很紧急,各位大侠快快请进!!(200分)(200分)

  • 主题发起人 主题发起人 cyy-997
  • 开始时间 开始时间
C

cyy-997

Unregistered / Unconfirmed
GUEST, unregistred user!
[?]各位大侠:
最近我自己开发了一个使用了Delphi的mediaplayer控件循环播放一系列声音列表的程序,
具体程序(mediaplayer操作部分)如下,在实际使用过程中,程序确实实现了循环
播放,但是问题是当程序运行了将近一个小时后,发现系统的运行速度变得非常慢,有
点象系统资源被耗尽的感觉,一个WAV读完后,要经过十几秒才播发列表中后一个WAV文
件,请问是什么原因,如能解答,真的是不胜感激,另外,如要实现相同的循环播放的
效果,能不能用API函数实现,麻烦给一下简单代码,这样做的话,是不是消耗系统资源
会少一点,再次衷心感谢您的帮助!!

源程序:
/////以下函数用于初始化MediaPlayer。
function TmainForm.Initplayer: Boolean;
var ErrorString:string;
begin

Result:=False;
try
MediaPlayer1.Close;
MediaPlayer1.Open;
MediaPlayer1.Notify:=True;
result:=true;
except
ErrorString:='系统出错:'+InttoStr(Error)+#13#10;
MessageDlg(ErrorString + MediaPlayer1.ErrorMessage,mtError,[mbOK],0);
end;

end;


procedure TmainForm.MediaPlayer1Click(Sender: TObject;
Button: TMPBtnType;
vardo
Default: Boolean);
begin

if Button=btStop then

begin

MediaPlayer1.Previous;
Gauge1.Progress:=0;
MediaPlayer1.EnabledButtons:=[btPlay];
MediaPlayer1.Notify:=false;
end
else
if Button=btPlay then

begin

InitialData;///用于初始化ListBox1的项目
SaveData;
///保存数据进数据库
DeleteData(ComboOrder.Text);///在数据库中删除指定数据
MediaPlayer1.FileName:=ListBox1.Items[ListBox1.ItemIndex];
if Initplayer then
begin

MediaPlayer1.EnabledButtons:=[btStop];
end;

///////油表用于指示声音列表的整体播发进程///
with gauge1do

begin

Maxvalue:=Listbox1.Items.Count;
Progress:=0;
end;

end;

end;


procedure TmainForm.MediaPlayer1Notify(Sender: TObject);
begin

if MediaPlayer1.Notify
///////当用下面一条判断语句时,MediaPlayer很容易中途停止播放,不再继续播发,故
///////改用上面的判断语句,不知是否正确
{(MediaPlayer1.NotifyValue=nvSuccessful) and (MediaPlayer1.Mode=mpStopped)}
then

begin

MediaPlayer1.Previous;
////下面语句用于循环读取列表中的数据,给MediaPlayer的FileName赋值
if ((Listbox1.ItemIndex+1)<(listbox1.Items.Count)) then

begin

Listbox1.ItemIndex:=Listbox1.ItemIndex+1;
Gauge1.Progress:=Gauge1.Progress+1;
end
else
begin

Listbox1.ItemIndex:=0;
Gauge1.Progress:=0
end;

MediaPlayer1.FileName:=Listbox1.Items[Listbox1.itemindex];
if Initplayer then
begin

MediaPlayer1.EnabledButtons:=[btStop];
MediaPlayer1.Play;
end;

end;

end;

//////////各位大侠如需要更详尽情况,劳繁联系我 Cyy-997@263.net /////////
 
procedure TmainForm.MediaPlayer1Notify(Sender: TObject);
begin

With MediaPlayer1do

begin

if Notify and (Mode=mpStopped) then

begin

....
end;

end;

end;
 
不好办。[:(]
 
zhihuali:
关键的一个问题是添加了Mode=mpStopped判断后,MediaPlayer很容易中断播发进程
就是播发过程中,当你狂动鼠标或切换窗体的时候,MediaPlayer有时会突然停止
播发,而且,当播发了一段较长时间后,系统速度会变得很慢,为什么会这样呢?
 
每次播放一个文件后就要释放一次。
 
To warket:
能不能告诉我如何释放,谢谢!
 
Close,再Open
 
TO 影 子
close,open 这一步我在initialplayer的函数中已经做过啦。
 
用api应该会好些,看看delphi帮助里的ms sdk help吧
 
begin

with MediaPlayer1 do

begin

if Notify and //接受信息
......
begin

ReWind;
play;
end;

notify:=true;//开始接受信息
end;
 
到2000或NT上调试,用资源察看器,看到底是什么原因,是不是内存被消耗关了,再来
找问题。因为还存在TMediaPlay里面的代码的问题呢
 
Tmediaplayer用起来确实很讨厌,不是很稳定,很容易出现
系统资源耗尽的情形。我最后实在受不了了,全部改用winapi
来实现背景音乐的播放。
建议用 mcisendstring异步播放音乐配合回调窗体或者在线程
中同步播放音乐。
mcisendstring的介绍在delphi帮助中有详细介绍
 
lvxq,和新手说的都很有道理,后来我在WINDOWS2000平台下调试,并采用API,现在系统运行的
很稳定。
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
740
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
551
import
I
I
回复
0
查看
763
import
I
后退
顶部