Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Filteranschlüsse nicht verbunden. (https://www.delphipraxis.net/13150-filteranschluesse-nicht-verbunden.html)

chris_82 11. Dez 2003 21:16


Filteranschlüsse nicht verbunden.
 
Hab mir folgende Prozedure geschrieben um das einer Webcam dazustellen.
Beim ersten Aufruf ist das kein Problem, da funktioniert alles, wenn ich aber in meiner Listbox ein zweites mal auf die Videoquelle klicke bzw. eine andere auswähle kommt immer die exception Filteranschlüsse nicht verbunden. Woran liegt das, wie kann ich das zum Bsp. in der Exception abfangen?

Delphi-Quellcode:
//Initialisieren des Bildes im VideoWindow
procedure TCapSource.StartCapture(Lbindex:integer; VideoWindow:TVideoWindow);
var index:integer;
    vw:tvideowindow;
begin
  //Klassen instanziieren
  try
  Filtergraph:=TFiltergraph.Create(VideoWindow);
  Filter:=TFilter.Create(VideoWindow);
  SampleGrabber:=TSampleGrabber.Create(VideoWindow);

  VideoWindow.FilterGraph:=Filtergraph;
  SampleGrabber.FilterGraph:=Filtergraph;
  Filter.FilterGraph:=Filtergraph;

  Filtergraph.ClearGraph;
  Filtergraph.Active:=False;
  Filter.BaseFilter.Moniker := Capenum.GetMoniker(Lbindex);
  Filtergraph.GraphEdit := true;
  Filtergraph.Mode := gmCapture;
  FilterGraph.Active := True;

  with Filtergraph as ICaptureGraphBuilder2 do
   RenderStream (@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter,
   SampleGrabber as IBaseFilter, VideoWindow as IBaseFilter);

  FilterGraph.Play;
  except
  end;
  end;

Kamil 11. Dez 2003 21:38

Re: Filteranschlüsse nicht verbunden.
 
Gibst du Filtergraph, Filter und SampleGrabber auch wieder frei (bevor du z.B. den Button nochmal anklickst)?

himitsu 11. Dez 2003 21:38

Re: Filteranschlüsse nicht verbunden.
 
Ich hab zwar davon keine Ahnung, aber ich könnte mir denken, woran es liegt.

Du erstellst ja hiermit neue Filter und so.
Delphi-Quellcode:
Filtergraph:=TFiltergraph.Create(VideoWindow);
Filter:=TFilter.Create(VideoWindow);
SampleGrabber:=TSampleGrabber.Create(VideoWindow);

VideoWindow.FilterGraph:=Filtergraph;
SampleGrabber.FilterGraph:=Filtergraph;
Filter.FilterGraph:=Filtergraph;
Bei zweiten Aufruf existieren die aber schon und es entsteht deiser Fehler.

Es gibt demnach also zwei Lösungen:
1: Du fragst vorm erstellen ab, ob sie schon erstellt wurden und erstellst sie nur, wenn sie noch nicht existieren.

2: Oder du gibst die vorher schon erstellten vorher frei.
z.B.:
Delphi-Quellcode:
Filtergraph.Free;
Filter.Free;
SampleGrabber.Free;
...
(die Freigabe sollte aber auch nur gemacht werden, wenn was existiert)

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

chris_82 11. Dez 2003 21:55

Re: Filteranschlüsse nicht verbunden.
 
wie überprüfe ich ob die objekte schon existieren?

Kamil 11. Dez 2003 22:04

Re: Filteranschlüsse nicht verbunden.
 
z.B. mit Assigned. Du muss aber nach dem Freigeben das Objekt auf nil setzten (z.B. FreeAndNil zum freigeben verwenden)

Luckie 11. Dez 2003 22:21

Re: Filteranschlüsse nicht verbunden.
 
Es wäre auch sinnvoll, die Objekte vor dem try-Block zu erstellen und dann eine try-finally Konstrukt zu verwenden und die Objekte im finally Abschnitt wieder frei zugen.
Delphi-Quellcode:
  sl := TStringList.Create;
  try
    sl. ...;
  finally
    FreeAndNil(sl);
  end;
Wenn es nicht erzeugt werden kann, ist auch kein Speicher reserviert, den man freigeben müsste. Bei deinem Konstrukt, müsste dir der Compiler übrigens eine Warnung ausgeben. Und Warnungen sollte man nicht ignorieren, die gibt der Compiler nicht nur zum Spaß aus.

chris_82 11. Dez 2003 22:33

Re: Filteranschlüsse nicht verbunden.
 
dei methode assigned gibt es wohl nicht, und was genau meinst du mit freeandnil..da find ich auch nur free

Kamil 11. Dez 2003 22:43

Re: Filteranschlüsse nicht verbunden.
 
Assigned ist in der Unit Systems.
FreeAndNil ist bei den Indy Komponenten dabei (IdGlobal.pas) und sieht so aus:
Delphi-Quellcode:
procedure FreeAndNil(var Obj);
var
  P: TObject;
begin
  if TObject(Obj) <> nil then begin
    P := TObject(Obj);
    TObject(Obj) := nil; // clear the reference before destroying the object
    P.Free;
  end;
end;

chris_82 11. Dez 2003 23:00

Re: Filteranschlüsse nicht verbunden.
 
Ja also woran wahrscheinlich das Problem liegt weiß ich jetzt wohl, dank eurer Hilfe, aber ich hab versucht dies auf das Problem umzumünzen, aber so recht will es noch nicht klappen. bekomme immer noch dieselbe Meldung.

Wenn ich FreeandNil benutze, muss ich die Objekte dann immer noch zerstören (.destroy)?

hab mal debuggt, der fehler kommt immer erst, wenn ich

Delphi-Quellcode:
 Filtergraph.Play
aufrufe.

edit: hab gesehen Free in der Methode FreeandNil zerstört ja das Objekt schon.

Kamil 11. Dez 2003 23:05

Re: Filteranschlüsse nicht verbunden.
 
Wie sieht dein Code jetzt aus?

chris_82 11. Dez 2003 23:15

Re: Filteranschlüsse nicht verbunden.
 
Hier das ist der Code, mit dem was ich bis jetzt neu eigebaut habe:

Delphi-Quellcode:
//Initialisieren des Bildes im VideoWindow
procedure TCapSource.StartCapture(Lbindex:integer; VideoWindow:TVideoWindow);
var index:integer;
    vw:tvideowindow;
begin
  //Klassen instanziieren
  Filtergraph:=TFiltergraph.Create(VideoWindow);
  Filter:=TFilter.Create(VideoWindow);
  SampleGrabber:=TSampleGrabber.Create(VideoWindow);

  try

  VideoWindow.FilterGraph:=Filtergraph;
  SampleGrabber.FilterGraph:=Filtergraph;
  Filter.FilterGraph:=Filtergraph;

  Filtergraph.ClearGraph;
  Filtergraph.Active:=False;
  Filter.BaseFilter.Moniker := Capenum.GetMoniker(Lbindex);
  Filtergraph.GraphEdit := true;
  Filtergraph.Mode := gmCapture;
  FilterGraph.Active := True;

  with Filtergraph as ICaptureGraphBuilder2 do
   RenderStream (@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter,
   SampleGrabber as IBaseFilter, VideoWindow as IBaseFilter);

  FilterGraph.Play;

  except

   Filtergraph.Stop;

   FreeandNil(Filtergraph);
   FreeandNil(Filter);
   FreeandNil(Samplegrabber);

   index:=lbindex;
   vw:=videowindow;
   capsource.StartCapture(index, vw);
 
  end;
end;
ich stoppe in dem except block auch erst mal den Filtergraph. Mit dem prüfen ob die Objekte scho existieren bin ich noch nicht klar gekommen.

Luckie 11. Dez 2003 23:46

Re: Filteranschlüsse nicht verbunden.
 
Und wenn keine Exception auftritt, werden die Objekte nicht freigegeben!!! :warn: Warum machst du es nicht so, wie man es normalerweise macht?

FreeAndNil ist auch in der Unit System drin. Desweiteren sollte man ein Obejkt auch immer mit Assigned testen. Auf Nil prüfen geht auch, aber wenn man Assigned benutzt wird klar, dass man das Objekt prüft und nicht etwa das Ergebnis eine Funktionsaufrufes oder so.

chris_82 11. Dez 2003 23:58

Re: Filteranschlüsse nicht verbunden.
 
Ja stimmt, sie sollten sonst auch freigegeben werden :pale:

warum ich es nicht so mache wie sonst auch?

mh, ist erst mein Zweites etwas größeres Delphiprojekt, bei dem ich eigene Klassen anlege und freigebe, davor hab ich es immer nur mit den vorgefertigten Komponenten versucht, die ich einfach reingezogen habe und fertig, und das waren auch sehr simple Probleme :cry:

So, jetzt bin ich aber erst mal reif für´s Bett, werd im Schaf mal drüber nachdenken :cat:

Aber ich werd mich anstrengen irgendwann vielleicht mal ähnlich viel Ahnung von Delphi zu haben....aber dafür benötige ich eure Hilfe...

schon mal DANKE an das DP-Team :dp: :dp: :dp:

chris_82 12. Dez 2003 07:19

Re: Filteranschlüsse nicht verbunden.
 
So jetzt funzt es erst mal :)

Dank der Hilfe des großen Neo´s......und natürlich euch.

Delphi-Quellcode:
if Assigned(Filtergraph) then
  begin
      Filtergraph.Stop;
      Filtergraph.Free;
      Filtergraph := nil;
  end;

  if Assigned(Filter) then
  begin
      Filter.Free;
      Filter := nil;
  end;

  if Assigned(SampleGrabber) then
  begin
      SampleGrabber.Free;
      SampleGrabber := nil;
  end;
jedenfalls wenn ich auf ein Device klicke, welches frei ist.


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