AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi en kleines Problem mit Thread
Thema durchsuchen
Ansicht
Themen-Optionen

en kleines Problem mit Thread

Ein Thema von Wishmaster · begonnen am 15. Feb 2006 · letzter Beitrag vom 16. Feb 2006
Antwort Antwort
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#1

en kleines Problem mit Thread

  Alt 15. Feb 2006, 12:21
Hi

Ich habe en kleines Problem mit TThread! Ich schreibe an eine Prog. Mit dem ich meine
Mp3, Playlists verwalten kann. Das Problem ist ich habe bis jetzt nie mit TThread gearbeitet.


Kuckt euch meine versuch mal an Feileich findet den Feiler. Ich well alles unterbrechen und direkt neu starten!



Delphi-Quellcode:
type
  TNetRadioThread = class(TThread)
  private

   Procedure PlayURL;
  public
  protected
   procedure Execute; override; // Net Radio
  end;




type
   TAudioEngine = class(TObject)
  private
    fNetThread : array of TNetRadioThread;





Destructor TAudioEngine.Destroy;
var i : integer;
begin
{Thread Terminate}
  if length(fNetThread) > 0 then
   begin
    for i := 0 to length(fNetThread) - 1 do
      fNetThread[i].Terminate;
   end;

{Free Bass}
 BASS_Free;
end;


{---------------------------- NetRadio Thread ---------------------------------}

procedure DownloadProc(buffer: Pointer; length: DWORD; user: DWORD); stdcall;
begin
 with AudioPlayer do // Get Server Status
  begin
   if (buffer <> nil) and (length = 0) then
    fServerStatus:= PChar(buffer)
  end;
end;


procedure TNetRadioThread.Execute;
var i : integer;
begin
try
   PlayURL; // test
 except
  on E: Exception do
    ShowMessage(E.Message);
 end;
end;


procedure TNetRadioThread.PlayURL;
  var Flag : DWORD;
      i : integer;
begin
 With AudioPlayer do
  begin
     BASS_StreamFree(Channel);
     BASS_MusicFree(Channel);

     PlayerState:= ENGINE_PLAYER_CONNECTING;
     Flag:= BASS_STREAM_STATUS;


     Channel:= BASS_StreamCreateURL(PChar(FFilename), 0, Flag, @DownloadProc, 0);
  if Channel = 0 then
     Channel:= BASS_FLAC_StreamCreateURL(PChar(FFileName), 0, Flag, @DownloadProc, 0);
  if Channel = 0 then
     Channel:= BASS_AAC_StreamCreateURL(PChar(FFileName), 0, Flag, @DownloadProc, 0);
  if Channel = 0 then
     Channel:= BASS_AC3_StreamCreateURL(PChar(FFileName), 0, Flag, @DownloadProc, 0);
  if Channel = 0 then
     Channel:= BASS_SPX_StreamCreateURL(PChar(FFileName), 0, Flag, @DownloadProc, 0);


    //Synchronize('');


  if BASS_ChannelPlay(Channel, true) then
    PlayerState:= ENGINE_PLAYER_PLAY
  else
    PlayerState:= ENGINE_PLAYER_STOP
  end;
end;


{---------------------------------- Play URL ----------------------------------}

Procedure TAudioEngine.PlayURL;
  var i : integer;
begin
 if length(fNetThread) > 0 then
   begin
    for i := 0 to length(fNetThread) - 1 do
     begin
      fNetThread[i].Terminate;
     end;
   end;

   Setlength(fNetThread, 1); // test

  for i := 0 to length(fNetThread) - 1 do
   begin
    fNetThread[i]:= TNetRadioThread.Create(true);
    fNetThread[i].Priority := tpNormal;
    fNetThread[i].FreeOnTerminate := True;
    fNetThread[i].Resume;
  end;
end;

{--------------------------------- Load  File ---------------------------------}

Procedure TAudioEngine.PlayFile(Filename : String);
var Flag : DWORD;
begin
   FFilename:= Filename;


  if isURL(Filename) then
   begin
     PlayURL;
    exit;
   end;



Procedure TAudioEngine.Stop();
var i : integer;
begin
 if length(fNetThread) > 0 then
  begin
   for i := 0 to length(fNetThread) - 1 do
    fNetThread[i].Terminate;
   end;

 if BASS_ChannelStop(Channel) then
   PlayerState:= ENGINE_PLAYER_STOP;
end;
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#2

Re: en kleines Problem mit Thread

  Alt 15. Feb 2006, 13:23
1. Welches Problem hast du? Welcher Fehler kommt wann und wo?
2. Du greifst im Execute-Teil auf eine Objekt namens Audioplayer zu. Wo wird das denn initialisiert?
3. Es gibt die Google-Toolbar, die die meisten Rechtschreibfehler findet.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#3

Re: en kleines Problem mit Thread

  Alt 16. Feb 2006, 05:21
Hi

OK.

1. es kommt kenne Feilermeldung! Es funzt eigentlich ziemlich gut, das Problem liegt daran das ich es nicht Stoppen kann. Ich kreiere en Channel zbw. mit(BASS_StreamCreateURL(…)) und bevor er fertig ist möchte ich alles Stoppen und en neuen Channel Kreieren. Wen ich Play Ausführe bevor er fertig ist Kreieret er mir en neuen Channel ohne den Vorherigen Freizugeben!

2. AudioPlayer ist nur ne Variable Abgeleite von TAudioEngine

Delphi-Quellcode:
  var AudioPlayer : TAudioEngine;

implementation

   Constructor TAudioEngine.Create(HWND : THandle);
   Begin

     if (not BASS_Init(bla, bla, bla)) then
    begin
      Error('Error initializing audio device!');
      halt;
    end;


  End;
Delphi-Quellcode:

type
  TMain_Form = class(TForm)




      procedure TMain_Form.FormCreate(Sender: TObject);
      begin
          AudioPlayer:= TAudioEngine.Create(Application.Handle);
      End;
mit Rechtschreibfehlern kannst bei mir rechnen. Warum? Ich bin nicht in Deutschland geboren, Ich habe nicht sehr lange in Deutschland gelebt. Ich Spreche 5 Sprachen und da komme ich manchmal Durcheinander. Und den Beitrag habe ich um 4 ~ 5 Uhr Morgens geschrieben. Oh Ja meine Keyboard Spricht nur Englisch somit kein Ö,Ü,( Z=Y=Z)


Ich hoffe das beantwortet alle deine frage?
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#4

Re: en kleines Problem mit Thread

  Alt 16. Feb 2006, 06:46
Dann rollen wir mal das Ganze von hinten auf.
Zu 3.: Sorry, das ist natürlich was anderes. Ich hab diesen kleinen Sarkasmus eingebaut, weil es oft vorkommt, das sich die Leute beim Schreiben keine Mühe geben und einfach so drauflos tippen.

Und nun zum Eigentlichen: Eine typische TThread.Execute Prozedur sieht etwa so aus:
Delphi-Quellcode:
procedure TMyThread.Execute();
begin
  while (not Self.Terminated) and (not Self.Suspended) do
  begin
    tudiesunddas;
  end;
end;
Diese Struktur erkennt, ob der Thread terminiert werden soll und ermöglicht damit auch seine Freigabe. Beim Überfliegen deines Codes habe ich aber keine derartige Struktur gefunden.

Aber um richtig in die Thread-Materie einzusteigen, empfehle ich dir Luckies Tutorial
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#5

Re: en kleines Problem mit Thread

  Alt 16. Feb 2006, 12:22
Hi

Fielen Dank für deine Hilfe, ich hatte es in einem Vorherigen versuch auch so ähnlich gemacht. Das Problem lag daran das ich den Code einfach durchlaufen lies ohne zu Überprüfen ob der Channel wirklich Frei ist. Anscheinen kann bass.dll den Channel nicht Schnell genug freigeben, bzw. die Verbindung zum Internet zu trennen.
Wen ich zbw. en WMA Stream (mms://) abspiele und dann versuch den zu stoppen oder das Programm zu schließen friert das Programm für ca 5 Sekunden ein was bei Mp3, ACC+, … ! nicht der fahl ist.



Vorher
Delphi-Quellcode:
    BASS_StreamFree(Channel);
    BASS_MusicFree(Channel);


     Channel:= BASS_StreamCreateURL(PChar(FFilename), 0, Flag, @DownloadProc,0);
  if Channel = 0 then
     Channel:= BASS_FLAC_StreamCreateURL(PChar(FFilename), 0, Flag, @DownloadProc,)

Nachher
Delphi-Quellcode:
  while (not Self.Terminated) and (not Self.Suspended) do
    begin

  if BASS_StreamFree(Channel) or (Channel = 0) then
     begin
       Channel:= BASS_StreamCreateURL(PChar(FFilename), 0, Flag, @DownloadProc,0);
    if Channel = 0 then
       Channel:= BASS_FLAC_StreamCreateURL(PChar(FFilename), 0, Flag, @DownloadProc,)
   end;


   if (Channel > 0) then
      break;

end;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz