Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Benoetige Hilfe bei "Threadsteuerung" (https://www.delphipraxis.net/179872-benoetige-hilfe-bei-threadsteuerung.html)

AnCorr 8. Apr 2014 06:56

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:
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;
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.


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 05:53 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