Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Speicherüberlauf nach ca. 5 Minuten (https://www.delphipraxis.net/85196-speicherueberlauf-nach-ca-5-minuten.html)

mlspider 27. Jan 2007 07:58


Speicherüberlauf nach ca. 5 Minuten
 
Moin

Ich veruche eine kleine Applikation zu entwickeln, mit der es möglich ist Web-TV Streams abzuspielen. Ich benutze dafür das OLE Objekt WindowsMediaPlayer aus der ActiveX-Palette.

In soweit ist es eigentlich kein Problem eine solch simple Anwendung zusammen zu schieben, wenn da nicht folgendes Problem wäre:

Nach dem Start der Anwendung kann ich im Taskmanager/Prozesse zusehen, das der Speicher immer voller wird. Gleiches trifft für die CPU-Auslastung zu. Irgenwann hängt die Anwendung.

In der Hoffnung das ich in der richtigen Sparte gelandet bin, stellt sich mir nun folgende Frage. Wie könnte man dieses Problem entgegnen?

Jeder Lösungsansatz könnte helfen.

Daniel G 27. Jan 2007 09:27

Re: Speicherüberlauf nach ca. 5 Minuten
 
Zitat:

Zitat von mlspider
Wie könnte man dieses Problem entgegnen?

Allozierst du irgendwo Speicher, den du nicht freigibst? 'N bisschen QT wäre nicht schlecht... :wink:

mlspider 27. Jan 2007 09:36

Re: Speicherüberlauf nach ca. 5 Minuten
 
Das habe ich mir auch schon überlegt. Die klare Antwort lautet Ja. Sowie das Puffern des Streams beendet ist, wird ein Timer auf True gesetzt, der mir über ein Label die aktuelle Position des Clips ausgibt.

Delphi-Quellcode:
procedure TVideoStreaming.Timer1Timer(Sender: TObject);
begin
 Label1.Caption:=WindowsMediaPlayer1.status;
 if vergleicheStringsN(Label1.Caption, Label2.Caption, 10)=True then begin
 Label3.Caption:=WindowsMediaPlayer1.controls.currentPositionString; //Hier benötige ich den Timer
 Label3.Visible:=True;
 Label4.Caption:=WindowsMediaPlayer1.currentMedia.name;
 Label4.Visible:=True;
 Label5.Caption:=WindowsMediaPlayer1.currentMedia.durationString;
 Label5.Visible:=True;
 end else begin
 Label3.Visible:=False;
 Label3.Caption:='';
 Label4.Visible:=False;
 Label4.Caption:='';
 Label5.Visible:=False;
 Label5.Caption:='';
 end;
end;

Daniel G 27. Jan 2007 09:42

Re: Speicherüberlauf nach ca. 5 Minuten
 
Zitat:

Zitat von mlspider
Die klare Antwort lautet Ja.

Und wo? :stupid:

Wie sieht die Funktion "VerarbeiteStringsN" aus?

mlspider 27. Jan 2007 09:51

Re: Speicherüberlauf nach ca. 5 Minuten
 
Ich glaube nicht, dass es etwas mit der Funktion zutun hat.

Delphi-Quellcode:
function vergleicheStringsN(s1, s2:string; n:Word): Boolean;

 var i: Word;
  function delLZ(s: string): string;
  var ss: string;
      i, j: Word;
  begin
   j:=0; ss:='';
   for i:=1 to Length(s) do
   begin
    if (s[i] <> ' ') and (s[i] <> '-') then
    begin
     Inc(j);
     ss:= ss + s[i]
    end;
    if j=n then Break
   end;
   Result := UpperCase(ss)
  end;

  begin
   if delLZ(s1)=delLZ(s2) then Result:=True else Result:=False;
  end;
  var flag:word;
Diese soll lediglich zwei Strings vergleichen. String1 hat einen festen Wert "Wiedergabe". Innerhalb der Timer Prozedur wird nun periodisch verglichen. Nach den Puffern bekommt String2 den Wert "Wiedergabe". Also ist es True. Ich hoffe ich habe mich verständlich ausgedrückt. :?

Übrigens der Timer wird schon mit Klick auf Play auf True gesetzt.

Der Timer bleibt solange True, bis ich die Wiedergabe beende. Ich vermute schon, dass es am Timer liegt.

SirThornberry 27. Jan 2007 10:19

Re: Speicherüberlauf nach ca. 5 Minuten
 
ich glaub schon das es was damit zu tun hat. Du fragmentierst den Speicher nich unerheblich wenn du ständig "String = String + Irgendwas" aufrufst. Du solltest vorher einmal mit SetLength die Länge setzen und dann nur noch in dem allocierten Speicher schreiben.

mlspider 27. Jan 2007 10:24

Re: Speicherüberlauf nach ca. 5 Minuten
 
Volltreffer! Ich hebe mal den Vergleich ausserhalb der Timerprozedur vorgenommen und siehe da, gleichbleibende Auslastung und Speicherbelegung. Danke.

Edit: Length Vergleich würde mir nichts bringen, da hinter "Wiedergabe" noch die Bitrate erscheint. Diese kann stark schwanken. So lasse ich nur die ersten 10 Zeichen überprüfen. Trotzdem Danke auch für diesen Hinweis.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:14 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