![]() |
en kleines Problem mit Thread
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; |
Re: en kleines Problem mit Thread
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. :stupid: |
Re: en kleines Problem mit Thread
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:
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)type TMain_Form = class(TForm) procedure TMain_Form.FormCreate(Sender: TObject); begin AudioPlayer:= TAudioEngine.Create(Application.Handle); End; Ich hoffe das beantwortet alle deine frage? |
Re: en kleines Problem mit Thread
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:
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.
procedure TMyThread.Execute();
begin while (not Self.Terminated) and (not Self.Suspended) do begin tudiesunddas; end; end; Aber um richtig in die Thread-Materie einzusteigen, empfehle ich dir ![]() |
Re: en kleines Problem mit Thread
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz