我想在一个程序中使用timer控件控制到一个时间播放一段声音
现在程序已经可经完成这个功能。
但是如果这个声音文件比较大,在到时播放时会有一段时间的延迟。
我想最好在到时播放声音文件时,能够启动另外一个线程进行播放,但是不会多线程,请高手们指教,谢谢!

解决方案 »

  1.   

    CreateThread或TThread类
    代码到处有
      

  2.   

    ..\Borland\Delphi7\Demos\Threads 有线程演示
      

  3.   

    \Borland\Delphi7\Demos\Threads
    现成的例子!不过要细看一下,要不很难理解,我个人觉的这个例子不太好,你可以上网查找一下其他的例子!
      

  4.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls, Buttons, ImgList, ComCtrls, ToolWin, Grids,
      DBGrids, DB, ADODB,ActiveX;type
      TForm1 = class(TForm)
        Image1: TImage;
        Memo1: TMemo;
        ImageList1: TImageList;
        BitBtn1: TBitBtn;
        DataSource1: TDataSource;
        ADOQuery1: TADOQuery;
        DBGrid1: TDBGrid;
        GroupBox1: TGroupBox;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Button4: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);
      private
        { Private declarations }
        Procedure TTobyAdoOver(Sender:Tobject);
      public
        { Public declarations }
      end;//**-----------更新图片线程----------------**//
    type
      TTobyIMG = class(TThread)
        TmpImg: TImage;
        TmpBool:Boolean;
      protected
       { Private declarations }
        procedure Execute;OverRide;
      private
        { Private declarations }
        procedure TmpChange;
      public
        { Public declarations }
        Constructor Create (TmpImage:TImage);
      end;//**-----------更新ADO线程----------------**//
    type
      TTobyAdo = class(TThread)
        TmpAdo: TAdoQuery;
        TmpBool:Boolean;
      protected
       { Private declarations }
        procedure Execute;OverRide;
      private
        { Private declarations }
        procedure TmpLoad;
      public
        { Public declarations }
        Constructor Create (TpAdo:TAdoquery);
      end;var
      Form1: TForm1;
      TobyIMG:TTobyIMG;
      TobyAdo:TTobyAdo;implementation{$R *.dfm}
    //**-----------------更新图片线程-----------**//
    Constructor TTobyIMG.Create(TmpImage:TImage);
    Begin
      FreeOnTerminate:=True;
      TmpImg:=TmpImage;
      TmpBool:=True;
      Inherited Create(False);
    end;Procedure TTobyIMG.Execute;
    Begin
      repeat
         sleep(500);
         Synchronize(TmpChange);
      until Terminated;
    end;Procedure TTobyIMG.TmpChange;
    begin
      if TmpBool then TmpImg.Picture.LoadFromFile('2.bmp')
      else TmpImg.Picture.LoadFromFile('1.bmp');
       TmpBool:=Not TmpBool;
    end;
    //**--------------更新ADO线程---------------**//
    Constructor TTobyAdo.Create(TpAdo:TAdoQuery);
    begin
      FreeOnTerminate:=True;
      TmpAdo:=TpAdo;
      inherited Create(False);
    end;Procedure TTobyAdo.Execute;
    begin
      TmpLoad;
    end;Procedure TTobyAdo.TmpLoad;
    begin
      CoInitialize(nil);//必须装载该函数在ActiveX类里
      sleep(3000);
      TmpAdo.Open;
      CoUninitialize; //释放com装载
    end;Procedure TForm1.TTobyAdoOver(Sender:Tobject);
    begin
      TobyIMG.Terminate;
    end;procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
      Adoquery1.Close;
      TobyAdo:=TTobyAdo.Create(Adoquery1);
      TobyIMG:=TTobyIMG.Create(image1);
      TobyAdo.OnTerminate:=TTobyAdoOver;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      TobyIMG:=TTobyIMG.Create(image1);
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
     TobyIMG.Suspend;
    end;procedure TForm1.Button3Click(Sender: TObject);
    begin
       tobyIMG.Resume;
    end;procedure TForm1.Button4Click(Sender: TObject);
    begin
     TobyIMG.Terminate;
    end;
    end.