Avatar billede thorin_deathrage Nybegynder
07. juni 2005 - 15:42 Der er 8 kommentarer

Hvordan unngå tikking når man bruker timere sammen med lyd

Jeg driver å lager et lydavspillings-program, og har problemer med at lyden hakker hver gang timeren tikker (onTimer procedure)

har noen en ide om hvordan jeg kan fikse dette?
Avatar billede kroning Nybegynder
07. juni 2005 - 17:20 #1
Brug en Thread til afspiling af lyden.
Avatar billede thorin_deathrage Nybegynder
08. juni 2005 - 17:07 #2
hm... vet du hvordan man gør d når man bruker TMMAudioPlayer?
er ikke akkuratt mester i programmering, og har nettop begynt å lære meg om multimedia... (er selvlært, går ikke på høyskole ellr no...)
Avatar billede kroning Nybegynder
08. juni 2005 - 18:48 #3
Jeg kender ikke TMMAudioPlayer, hvor finder man den?
Avatar billede borrisholt Novice
09. juni 2005 - 15:07 #4
Brug den her timer i stedet for din alm timer :

// TThreadTimer -> TComponent
// A timer replacement that uses a thread to manage the timer events.

// Feel free to modify and use this code.
// The only thing I ask, is that you leave my name in the source file.

// Please note that I provide this code as an example, and I
// make no warranties whatsoever on the results of using this code.
// Meaning: Whatever happens because you've used this code, is your own
// responsibility.

// Also note that I have NOT tested this code very thoroughly, I just
// wrote it in response to several newsgroup messages requesting information
// on how to implement SysTray icons.

// Thule Air Base, Greenland, May 30. 2000
// Jens Borrisholt

unit ThreadTimer;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, MMSystem;

type
  TThreadTimer = class;

  TTimerThread = class(TThread)
  private
    tt: TThreadTimer;
  protected
    procedure DoExecute;
  public
    constructor CreateTimerThread(tt: TThreadTimer);
    procedure Execute; override;
  end;

  TThreadTimer = class
  private
    FInterval: integer;
    FPriority: TThreadPriority;
    FOnTimer: TNotifyEvent;
    bStop: boolean;
    bRunning: boolean;
    FEnabled: boolean;
  protected
    procedure setEnabled(b: boolean);
    procedure Start;
    procedure Stop;
  public
    constructor Create;
  published
    property Enabled: boolean read FEnabled write setEnabled;
    property Interval: integer read FInterval write FInterval;
    property ThreadPriority: TThreadPriority read FPriority write FPriority default tpNormal;
    property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
  end;

implementation

//Initialize thread priority

constructor TThreadTimer.Create;
begin
  inherited;
  FPriority := tpNormal;
end;

//Changing the Enabled property calls either Start or Stop protected methods.

procedure TThreadTimer.setEnabled(b: boolean);
begin
  if b then
    Start
  else
    Stop;
  FEnabled := bRunning;
end;

// Starting the timer creates an instance of TTimerThread and launches the thread.

procedure TThreadTimer.Start;
begin
  if bRunning then
    Exit;
  bStop := false;
  with TTimerThread.CreateTimerThread(self) do
  begin
    Priority := FPriority;
    Resume;
  end;
  bRunning := true;
end;

//Stopping the timer just sets the stop flag to
//true, the TTimerThread's Execute method will
//then end and the thread will be destroyed.

procedure TThreadTimer.Stop;
begin
  bStop := true;
  bRunning := false;
end;

constructor TTimerThread.CreateTimerThread(tt: TThreadTimer);
begin
  inherited Create(true);
  self.tt := tt;
  FreeOnTerminate := true;
end;

//Execute method for the spawned thread.  Just
//repeats while the timer is enabled, and calls the
//timer object's OnTimer event.

procedure TTimerThread.Execute;
var
  SleepTime, Last: integer;
begin
  while not tt.bStop do
  begin
    Last := timeGetTime;
    Synchronize(DoExecute);
    SleepTime := tt.FInterval - (Integer(timeGetTime) - Last);
    if SleepTime < 10 then
      SleepTime := 10;
    sleep(SleepTime);
  end;
end;

//This method is called within the TTimerThread's
//Execute, using the Synchronize method.  This is
//because we need to call the event handler from
//the main VCL thread.

procedure TTimerThread.DoExecute;
begin
  with tt do
  begin
    if Assigned(FOnTimer) then
      FOnTimer(tt);
  end;
end;

end.


Jens B
Avatar billede thorin_deathrage Nybegynder
12. juni 2005 - 18:59 #5
hvordan aksepterer jeg svar?
Avatar billede kroning Nybegynder
12. juni 2005 - 20:32 #6
Det kan du først når du har fået et svar.
Avatar billede thorin_deathrage Nybegynder
20. juni 2005 - 17:51 #7
k..

faktisk så er det fortsatt en tikking... hmm... litt irriterende problem dette...

tikkingen kan også komme av et problem jeg har hatt med delphi'en min, har reinnstallert nå og skal sjekke om det fortsatt er slik senere i dag..
Avatar billede thorin_deathrage Nybegynder
22. juni 2005 - 23:53 #8
lol.. nå fikke jeg ikke kompilert pga at jeg ikke hadde masks.dcu (jeg spør IKKE om å få den filen, siden jeg har fått vite at det ike er lov)...

anntar jeg må skrinlegge prosjektet til jeg har råd til en bedre delphi versjon...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester