![]() |
Benoetige Hilfe bei "Threadsteuerung"
Hallo zusammen,
ich braeuchte wieder einmal eure Hilfe. Viele von euch kennen sicher das Beispielprogramm "Netradio", welches bei den BASS Komponenten mitgeliefert wird. Ich habe den Teil, welcher zum Abspielen eines Internet-Radiosenders dient, in mein Programm mit eingebaut. Soweit ich dies nun beurteilen kann, laeuft dieser Teil als ein eigenstaendiger Thread. Leider habe ich mit Threads bisher noch nicht gearbeitet. Ich habe mir Beispiele aus dem Internet angesehen, und festgestellt, dass diese alle anders aufgebaut sind, als dies bei "Netradio" der Fall ist. Nun zu meinem Problem. In der Prozedur "DoMeta" wird nach Moeglichkeit der Titel eines Radiostreams ausgelesen und ausgegeben. Diese Prozedur ist Teil des von Netradio verwendeten Threads. In meinem Hauptprogramm habe ich Routinen zum Starten und Stoppen von Aufnahmen. Nun moechte ich aus der Prozedur "DoMeta" eine Aufnahme stoppen, wenn sich der Titel eines Streams aendert. Danach soll aus der Routine zum Stoppen eine neue Aufnahme gestartet werden. Das Stoppen funktioniert noch, aber das neue Starten nicht. Dies liegt m. E. daran, dass dass Stoppen ja aus dem "Nebenthread" angestossen wurde. Das neue Starten wuerde aber wieder aus dem Hauptthread geschehen, und das funktioniert so nicht. Wie kann ich eine neue Aufnahme triggern? Ich verwende die Routinen zum Aufnehmen (Starten/Stoppen) fuer eine weitere Funktion des Programmes. Hierfuer funktioniert alles so wie ich es moechte. Sowohl von "Hand" gestartet und gestoppt, als auch durch programmierte Steuerung. Nur in Verbindung mit der "Netradio"-Funktion nicht. Irgendwie habe ich das "Gefuehl", dass der Thread des Netradio-Beispiels nicht so aufgebaut ist, wie es die anderen Beispiele ueber Threads zeigen. Das Programm ist mit Firemonkey programmiert, wodurch ich auch noch keine Moeglichkeit mittels "Sendmessage" und einer "WndProc" Prozedur gefunden habe. Hier der Teil, in der ein Titel ausgelesen wird, und ich eine laufende Aufnahme stoppen moechte:
Delphi-Quellcode:
In der Routine zum Stoppen einere Aufnahme werden verschiedene Parameter geprueft, und ggf. die aufgenommene Datei abgespeichert. Dann wird noch geprueft, ob weitere Aufnahmen zu erledigen sind, und dies ggf. aus der Routine heraus gestartet.
procedure DoMeta();
var Meta: PAnsiChar; p: Integer; Info1: String; Info2: String; begin Meta := ''; try // Get meta information from stream Meta := BASS_ChannelGetTags(AudioStream, BASS_TAG_META); except end; if (Meta <> nil) then begin try // Try to read the stream title p := Pos('StreamTitle=', String(AnsiString(Meta))); if (p = 0) then Exit; p := p + 13; // 'Cut' out the title of a stream and replace some special characters try Info1 := String(Copy(Meta, p, Pos(';', String(Meta)) - p - 1)); Info1 := StringReplace(Info1, '|', ' - ', [rfReplaceAll]); Info1 := StringReplace(Info1, '/', ' - ', [rfReplaceAll]); Info1 := StringReplace(Info1, '\', ' - ', [rfReplaceAll]); Info1 := StringReplace(Info1, ':', ' - ', [rfReplaceAll]); Info1 := StringReplace(Info1, '!', '', [rfReplaceAll]); Info1 := StringReplace(Info1, ';', ' - ', [rfReplaceAll]); Info1 := StringReplace(Info1, '*', '', [rfReplaceAll]); Info1 := StringReplace(Info1, '#', '', [rfReplaceAll]); Info1 := StringReplace(Info1, '>', '', [rfReplaceAll]); Info1 := StringReplace(Info1, '<', '', [rfReplaceAll]); // Set 'new' titel NewTitle := Info1; // Display title on form Mainform.Lbl_Filename.Text := NewTitle; // Check length of title CheckTextLength; // Refresh form Mainform.Invalidate; // Check if title has changed if StreamTitle <> NewTitle then begin // Check if app is recording and the auto cut feature is enabled if (AutoCut) and (IsRecording) then StopRecording; // Stop recording and save file // Set new title StreamTitle := NewTitle; end; except end; except end; end; end; Ich wuerde mein fertiges Programm spaeter gerne hier in den Projekten vorstellen. Dazu moechte ich es aber erst noch fertigstellen. Vielleicht koennt ihr mir mit dem o. g. Problem ja weiterhelfen. Danke schon mal im voraus! Gruss Micha |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:53 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