我想FormShow和FormClose都只执行一次,如果有问题应该在Timer1Timer中,但是不知道TAudioFileStream控件(好像不是Delphi自带的),它的FileName属性直接置空是否可行。
解决方案 »
- combobox1.items.addobject()中的对象需要释放吗?
- 请问:我怎么才能按字节从文件中取出每个字节中所对应的字符?文件中还有Unicode字符,我要如何读取呢?
- 各位高手,能不能调用WINDOWS的“画图”呀,就是开始菜单附件那个,马上给分
- COM问题
- 控制台程序???
- 谁能用Delphi 写出获取网关地址的程序!(高手请进)
- 关于TreeView?
- WOCKET多线程编程如何实现自己的线程代码???
- 关于如何判断窗口最小化状态
- -=-=-=-=-=-=-=-添加数据时出现KEY VIOLATION ,如何考虑出错原因啊? -=-=-=-=-=-=-=-
- 怎么快速的判断网络通讯故障!Socket通讯连接不上!
- 为什么同样的加、解密算法在Win98上正常,在NT4.0则不正常?
WIN98死机就再启动吗!呵呵!
共有两个模块:
/////////////////////////////////////////////////////
unit Main;{
主窗口:TMainForm;
TMainForm中只有一个按钮,一个DxSound1对象
当用户按下Play按钮时,主窗口向线程TGirl送入2000个文件名请求回放
}interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, DXSounds, Girl;type
TMainForm = class(TForm)
PlayButton: TButton;
DXSound1: TDXSound;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure PlayButtonClick(Sender: TObject);
procedure DXSound1Finalize(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
MainForm: TMainForm;
GirlActiveFlag:Boolean;
TheGirl:TGirl=nil;
Audio:TAudioFileStream;implementation{$R *.DFM}procedure TMainForm.FormShow(Sender: TObject);
begin
try//初始化DxSound1和Audio,建立TGirl线程
DxSound1.Driver:=DxSound1.Drivers[0].GUID;
DxSound1.Options:=[soGlobalFocus];
DxSound1.Initialize;
if DxSound1.Initialized then
begin
Audio:=TAudioFileStream.Create(MainForm.DxSound1.DSound);
Audio.AutoUpdate:=True;
Audio.BufferLength:=1024;
Audio.Looped:=False;
TheGirl:=TGirl.Create;
end;
except
end;
if not DxSound1.Initialized then
begin//初始化失败,关闭程序
PlayButton.Enabled:=False;
ShowMessage('DirectSound对象初始化失败.');
PostMessage(Handle,Wm_Close,0,0);
end;
end;procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if TheGirl<>nil then
begin//关闭线程
TheGirl.Terminate;
while GirlActiveFlag do
Application.ProcessMessages;
TheGirl:=nil;
end;
end;procedure TMainForm.PlayButtonClick(Sender: TObject);
var
i:Integer;
begin
for i:=1 to 1000 do
begin//发送文件名
TheGirl.PutData('1.wav');
TheGirl.PutData('2.wav');
end;
end;//DxSound1的OnFinalize事件
procedure TMainForm.DXSound1Finalize(Sender: TObject);
begin
if Audio<>nil then
begin
Audio.Free;
Audio:=nil;
end;
end;end./////////////////////////////////////////////////////////////
unit Girl;{
线程:TGirl;
TGirl自己维护一个文件名列表FileNames,用来存放等待回放的文件名
运行时,不断侦测Audio的状态,一旦空闲就取出下一个文件名来播放
}interfaceuses
Windows,Messages,Classes, DXSounds;type
TGirl = class(TThread)
private
FileNames:TStringList;//文件名列表
FileNamesMutex:THandle;//存取令牌
NextFileName:String;
Busy:Boolean;//Audio忙信号 function GetData:String;//从列表中取第一个文件名
procedure CheckAudioStatus;//返回Audio的状态
procedure PlayNextFileName;//用Audio播放下一个文件名
protected
procedure Execute; override;
public
procedure PutData(s:String);//向列表追加一个文件名
constructor Create;
end;implementationUses
Main;{ TGirl }constructor TGirl.Create;
begin
FreeOnTerminate:=True;
Inherited Create(False);
end;procedure TGirl.CheckAudioStatus;
begin
Busy:=Audio.Playing;
end;procedure TGirl.PlayNextFileName;
begin
Audio.Stop;
Audio.FileName:='';
Audio.FileName:=NextFileName;
Audio.Play;
end;function TGirl.GetData:String;
begin
if WaitForSingleObject(FileNamesMutex,100)=Wait_Object_0 then
begin
if FileNames.Count>0 then
begin
GetData:=FileNames[0];
FileNames.Delete(0);
end;
ReleaseMutex(FileNamesMutex);
end;
end;procedure TGirl.PutData(s:String);
begin
if WaitForSingleObject(FileNamesMutex,100)=Wait_Object_0 then
begin
FileNames.Add(s);
ReleaseMutex(FileNamesMutex);
end;
end;procedure TGirl.Execute;
begin
FileNames:=TStringList.Create;
FileNamesMutex:=CreateMutex(nil,False,nil); try
try
GirlActiveFlag:=True;
while not Terminated do
begin
Synchronize(CheckAudioStatus);//侦测Audio的状态
if not Busy then//空闲否?
begin
NextFileName:=GetData;//取得下一个文件名
if NextFileName<>'' then
begin
Busy:=True;
Synchronize(PlayNextFileName);
end;
end;
end;
finally
FileNames.Free;
CloseHandle(FileNamesMutex);
GirlActiveFlag:=False;
end;
except
end;
end;end.大家快来帮帮我吧,我快要急死了,这个程序在运行的过程中,系统的响应越来越慢,最后死机
timer1.timer最后加enable tiemr.
以确保不重入timer