AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Benoetige Hilfe bei "Threadsteuerung"
Thema durchsuchen
Ansicht
Themen-Optionen

Benoetige Hilfe bei "Threadsteuerung"

Ein Thema von AnCorr · begonnen am 8. Apr 2014
Antwort Antwort
AnCorr

Registriert seit: 15. Mär 2010
45 Beiträge
 
#1

Benoetige Hilfe bei "Threadsteuerung"

  Alt 8. Apr 2014, 07:56
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

Geändert von AnCorr ( 8. Apr 2014 um 07:59 Uhr) Grund: Rechtschreibfehler korrigiert
  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 23:15 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