我想FormShow和FormClose都只执行一次,如果有问题应该在Timer1Timer中,但是不知道TAudioFileStream控件(好像不是Delphi自带的),它的FileName属性直接置空是否可行。

解决方案 »

  1.   

    应该是有没释放的内存.可能是Form没有释放掉!
      

  2.   

    TAudioFileStream是DelphiX中的一个组件,DelphiX是一个日本人写的封装了DirectX的控件包,用过DelphiX的大哥帮帮忙吧...
      

  3.   

    第三方控件的问题不好解决啊,有SOURCE吗
      

  4.   

    SOURCE倒是有,只是涉及到DirectX,唉,头痛啊...
      

  5.   

    win98 什么不干开一天都会死机。
      

  6.   

    WIN98自己都不稳定,连续运行十几个小时非常有可能死机,这很有可能。
      

  7.   

    从你的这段代码里看不出什么问题,可以把你的原代码发给我,我帮你看看([email protected])。我曾经成功的将一个用VC+DIRECTX写的一个程序移植到DELPHI+DIRECTX。
      

  8.   

    TTimer要占用系统资源。除了不断调用SetTimer和KillTimer,还要处理WM_TIMER消息。可能重复运行过多,内存未及时释放,如果将interval属性值改大一点,应该可以支持更长一点时间。呵呵:)。
      

  9.   

    没什么大问题!
    WIN98死机就再启动吗!呵呵!
      

  10.   

    这段代码有一个问题没有考虑到,如果每一次进入Timer中都要把用户输入的WAV文件播放程序调用一次,TAudioFileStream会自己停止播放吗?问题会不会出在这。可以把源码给我一份,我看看[email protected]
      

  11.   

    不好意思写错信箱了:[email protected]
      

  12.   

    如果你是想要循环播放wav并纪录播放次数,建议不要使用ttimer,我想应该有个wav播放时的事件,在那里写可能要好的多。你的程序的问题可能出在使用ttimer的事件上,导致多次play wav,占用系统资源。
      

  13.   

    如果你是想要循环播放wav并纪录播放次数,建议不要使用ttimer,我想应该有个停止播放时的事件,在那里写可能要好的多。你的程序的问题可能出在使用ttimer的事件上,导致多次play wav,占用系统资源。
      

  14.   

    在play语句之前加入stop或close语句,清除临时数据。
      

  15.   

    如果有结果也给我一分。[email protected]
      

  16.   

    建议用memproof全面检查(包括内存、图像窗口资源)。我也认为很有可能是TDxSound的Bug,你可以屏蔽掉与其有关所有的代码,运行看多久会死机,对比得出是否与TDxSound有关。
      

  17.   

    我同意dDRIVE的意见,应该在timer事件开始时就Stop,这样才不会占用太多内存!
      

  18.   

    完整的源程序:
    共有两个模块:
    /////////////////////////////////////////////////////
    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.大家快来帮帮我吧,我快要急死了,这个程序在运行的过程中,系统的响应越来越慢,最后死机
      

  19.   

    我写程序的水平很低,各位大哥有什么地方看不懂的尽管提出来...,我用Memproof检查了,它骗我说没有任何问题
      

  20.   

    进入timer后,disable timer.
    timer1.timer最后加enable tiemr.
    以确保不重入timer
      

  21.   

    加入TIMER是为了模拟,实际使用中也没有TIMER,后来不我用TIMER了