Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi crash in FindFile OpenGl (https://www.delphipraxis.net/116872-crash-findfile-opengl.html)

EWeiss 8. Jul 2008 06:17


crash in FindFile OpenGl
 
Weis nicht was los ist aber mit unter crasht meine Anwendung sobald ich
den dritten oder vierten Titel starte und das dazugehörige Cover eingeladen wird.
Es kommt keine bezeichnende meldung außer das standard mäßige AV kann nicht lesen bla.. bla

In LoadSetting gebe ich die Texturen frei
Delphi-Quellcode:
    if Assigned(QuadTexture) then
    begin
      glDeleteTextures(Length(QuadTexture), @QuadTexture[Low(QuadTexture)]);
      SetLength(QuadTexture, 0);
    end;

    glDeleteTextures(1, @BackTexture);    // Texture für Hintergrund
    glDeleteTextures(1, @GradientTex);    // Texture für DiskSpectrum
    glDeleteTextures(1, @MeterTexture);   // Texture für VUMeter
    glDeleteTextures(1, @PeaksTexture);   // Texture für Peaks
    glDeleteTextures(1, @SpectrumTexture); // Texture für Spectrum
    glDeleteTextures(1, @BarTexture);     // Texture für Slider
    glDeleteTextures(1, @PrivateTexture); // Texture für CDLabel
    glDeleteTextures(1, @NoCoverTexture); // Texture für NoCover

    SetLength(quadTexture, QuadCount);
dann werden neue Cover gesucht

Delphi-Quellcode:
procedure ScanDirectory(Path, Mask: String; SubFolder: Boolean);
var
  Attrib,k : Integer;
  Search   : TSearchRec;
  aFileName : string;
  tmpFile  : string;
begin
  Attrib := faArchive + faReadOnly + faHidden;

  if Path[Length(Path)] <> '\' then Path := Path + '\';

  with TStringList.Create do
  try
    CommaText := Mask;
 
    for k := 0 to Count - 1 do
    if FindFirst(Path + '*.' + Strings[k], Attrib, Search) = 0 then
      repeat
        aFileName := ExtractFileName(Search.Name);
        // extract extension
        aFileName := Copy(aFileName, 1, length(aFileName) - length(ExtractFileExt(aFileName)));
        // UpperCase
        aFileName := AnsiUpperCase(aFileName);
        tmpFile := AnsiUpperCase(Path + Search.Name);
        if (aFileName = 'COVER') or (aFileName = 'CDLABEL') then
        begin
          if (not CheckIfDouble(tmpFile, aCovers, false)) then
            aCovers.Add(AnsiUpperCase(Path + Search.Name));
        end;
      until FindNext(Search) <> 0;

    SysUtils.FindClose(Search);
  finally
    Free
  end;

  if SubFolder then
  begin
    if FindFirst(Path + '*.*', faDirectory, Search) = 0 then
    begin
      repeat
        if ((Search.Attr and faDirectory) = faDirectory) and
          (Search.Name[1] <> '.') then
          ScanDirectory(Path + Search.Name, Mask, SubFolder);
      until FindNext(Search) <> 0;

      SysUtils.FindClose(Search);
    end;
  end;

end;
hier wird die function zum suchen aufgerufen
Delphi-Quellcode:
    if ShowCover = true then
    begin
      if not assigned(aCovers) then
        aCovers := TStringList.Create;

      if CoverPath <> '' then
      begin
        if CoverPath <> Path then
          ScanDirectory(CoverPath, 'bmp, tga, jpg', False);

        if (aCovers.count <= QuadCount) then
        begin
          aFilledQuads := 0;
          for i := 0 to aCovers.count-1 do
          begin
            // den Dateinamen extrahieren
            aFileName := ExtractFileName(aCovers[i]);
            // die Dateiendung abscheiden
            aFileName := Copy(aFileName, 1, length(aFileName) - length(ExtractFileExt(aFileName)));
            // Upper-Case machen
            aFileName := AnsiUpperCase(aFileName);

            if (aFileName <> 'COVER') then
            begin
              QuadTexture[i] := NoCoverTexture;
              dec(aFilledQuads);
            end else
            begin
              LoadTexture(aCovers[i], quadTexture[aFilledQuads], False);
            end;
            inc(aFilledQuads);
          end;

          if (QuadCount >= (aCovers.count - 1)) then
          begin
            for q := (aCovers.count - aFilledQuads) to QuadCount do
              QuadTexture[q] := NoCoverTexture;
          end; // end for i
        end; // end aCovers.count
      end; // end CoverPath
    end; //end ShowCover

end;
Das seltsame an der sache ist lasse ich die Titel einfach weiterlaufen
also wenn das eine beendet wird
das nächste über eine syncproc gestartet
dann läuft alles rund

Wechsel ich die Titel von Hand doppelklick
Kommt es vor das nach dem 3 oder 4 Titel die Anwendung beendet
mit dem oben genannten AV.

Weis mir keinen rat woran das liegen könnte.

gruss Emil

scp 8. Jul 2008 08:42

Re: crash in FindFile OpenGl
 
Bei dem FindFirst in der Schleife mit dem k bei ScanDirectory fehlt ein begin ... end, weil jedesmal FindClose aufgerufn werden muss.

Delphi-Quellcode:
    for k := 0 to Count - 1 do
    if FindFirst(Path + '*.' + Strings[k], Attrib, Search) = 0 then
    begin
      repeat
        aFileName := ExtractFileName(Search.Name);
        // extract extension
        aFileName := Copy(aFileName, 1, length(aFileName) - length(ExtractFileExt(aFileName)));
        // UpperCase
        aFileName := AnsiUpperCase(aFileName);
        tmpFile := AnsiUpperCase(Path + Search.Name);
        if (aFileName = 'COVER') or (aFileName = 'CDLABEL') then
        begin
          if (not CheckIfDouble(tmpFile, aCovers, false)) then
            aCovers.Add(AnsiUpperCase(Path + Search.Name));
        end;
      until FindNext(Search) <> 0;

      SysUtils.FindClose(Search);
    end;

EWeiss 8. Jul 2008 17:41

Re: crash in FindFile OpenGl
 
Zitat:

Zitat von scp
Bei dem FindFirst in der Schleife mit dem k bei ScanDirectory fehlt ein begin ... end, weil jedesmal FindClose aufgerufn werden muss.

Ja oder einfach
Delphi-Quellcode:
  with TStringList.Create do
  try
     [....]
  finally
    SysUtils.FindClose(Search);
    Free
  end;
kann mir dann begin . end sparen.[nee doch nicht]
Habs gefixt.
Aber das lößt auch nicht mein problem.

EDIT:
habe die vermutung das es hier dran liegt
Delphi-Quellcode:
function LoadJPGTexture(Filename: String; var Texture: GLuint; LoadFromResource : Boolean): Boolean;

  // Create Bitmap
  BMP:=TBitmap.Create;
  BMP.pixelformat:=pf32bit;
  BMP.width:=JPG.width;
  BMP.height:=JPG.height;
  BMP.canvas.draw(0, 0, JPG);
irgendwie kommt die laderoutine mit dem Timing nicht klar.
würde es an FindFile liegen dann ging eigentlich gar nichts.

gruss Emil

EWeiss 8. Jul 2008 21:30

Re: crash in FindFile OpenGl
 
Habe das problem gefunden

Delphi-Quellcode:
aCovers := TStringList.Create;
Kann das nur lösen in dem ich eine Listbox verwende
und aCovers auf diese Caste

Was läuft hier schief das es mit TStringList nicht funktioniert ?

Delphi-Quellcode:
 if ShowCover = true then
    begin
      if not assigned(aCovers) then
        aCovers := TStringList.Create;
erstelle hier die TStringList und gebe sie nur frei wenn der Anzeigemodus geändert wird.

hier werden die Einträge addiert
Delphi-Quellcode:
          if (not CheckIfDouble(tmpFile, aCovers, false)) then
            aCovers.Add(AnsiUpperCase(Path + Search.Name));
Und das stürzt zu unbestimmten zeiten ab.
Wenn ein neuer Titel geladen wird.

gruss Emil

Dunkel 8. Jul 2008 22:26

Re: crash in FindFile OpenGl
 
Zitat:

Zitat von EWeiss
Habe das problem gefunden

Delphi-Quellcode:
aCovers := TStringList.Create;
Kann das nur lösen in dem ich eine Listbox verwende
und aCovers auf diese Caste

Was läuft hier schief das es mit TStringList nicht funktioniert ?

Warum gibst Du die StringList frei und erstellst eine neue? Du reißt doch auch nicht ein Haus ein und baust ein neues, nur weil Du die Wände im Schlafzimmer in einer neuen Farbe haben möchtest. :zwinker:
TStringList.Clear; sollte doch reichen. Dann nicht mit Assigned(TStringList) prüfen, sondern mit TStringList.Count <> 0.

EWeiss 8. Jul 2008 22:35

Re: crash in FindFile OpenGl
 
Zitat:

Zitat von Dunkel
Zitat:

Zitat von EWeiss
Habe das problem gefunden

Delphi-Quellcode:
aCovers := TStringList.Create;
Kann das nur lösen in dem ich eine Listbox verwende
und aCovers auf diese Caste

Was läuft hier schief das es mit TStringList nicht funktioniert ?

Warum gibst Du die StringList frei und erstellst eine neue? Du reißt doch auch nicht ein Haus ein und baust ein neues, nur weil Du die Wände im Schlafzimmer in einer neuen Farbe haben möchtest. :zwinker:
TStringList.Clear; sollte doch reichen. Dann nicht mit Assigned(TStringList) prüfen, sondern mit TStringList.Count <> 0.

da hast allerdings recht ;)
werd das nochmal prüfen ob es in zusammenhang mit meinen problem steht.

Hab zwar geschrieben gelößt .. ist es aber nicht.
Scheint wirklich ein Problem mit OpenGL zu sein alles schon versucht
Anstelle JPG jetzt nur noch BMP verwendet stürzt trotzdem ab.

hmm vielleicht gebe ich es auf mit dem Projekt.

trotzdem Danke.

gruss Emil

Dunkel 8. Jul 2008 22:52

Re: crash in FindFile OpenGl
 
Mein Kommentar bezieht sich auf Dein
Zitat:

Zitat von EWeiss
Kann das nur lösen in dem ich eine Listbox verwende und aCovers auf diese Caste

Was läuft hier schief das es mit TStringList nicht funktioniert ?

Die Listbox gibt die interne TStringList auch nicht bei jeder Änderung frei und erstellt eine neue. Unter Umständen liegt der Fehler wirklich irgendwo da; vor allem, da Assigned(Something) nur auf <> NIL prüft, ein reines TStringList.Free setzt die Variable aber nicht auf NIL. Probier es vielleicht mal mit einem FreeAndNil(TStringList);.

EWeiss 8. Jul 2008 23:01

Re: crash in FindFile OpenGl
 
Zitat:

Zitat von Dunkel
Mein Kommentar bezieht sich auf Dein
Zitat:

Zitat von EWeiss
Kann das nur lösen in dem ich eine Listbox verwende und aCovers auf diese Caste

Was läuft hier schief das es mit TStringList nicht funktioniert ?

Die Listbox gibt die interne TStringList auch nicht bei jeder Änderung frei und erstellt eine neue. Unter Umständen liegt der Fehler wirklich irgendwo da; vor allem, da Assigned(Something) nur auf <> NIL prüft, ein reines TStringList.Free setzt die Variable aber nicht auf NIL. Probier es vielleicht mal mit einem FreeAndNil(TStringList);.

Hast da was falsch verstanden ..
Ich gebe sie nicht jedesmal wieder frei nur wenn der Modus sich ändern
quasi die Covers nicht mehr verwendet werden.

Mein problem tritt aber auf wenn ich die Liste fülle ..
oder anders gesagt neue Cover addiert werden.

gruss Emil

Dunkel 8. Jul 2008 23:10

Re: crash in FindFile OpenGl
 
Zitat:

Zitat von EWeiss
Mein problem tritt aber auf wenn ich die Liste fülle ..
oder anders gesagt neue Cover addiert werden.

OK, Du prüfst aber mit Assigned ob die TStringList gültig ist, Assigned arbeitet aber unter meinen oben genannten Bedingungen nicht zuverlässig. Und in einen Speicherbereich zu schreiben, welcher schon via .Free freigegeben wurde, verursacht Zugriffsverletzungen...

Edit:
Ja, jetzt weiß ich, was Du meinst. Nichts desto trotz verursacht schreiben in ungültige Speicherbereiche Zugriffsverletzungen. Zu wenig Code um den Fehler einzugrenzen :glaskugel: ...

EWeiss 9. Jul 2008 05:50

Re: crash in FindFile OpenGl
 
Zitat:

Zu wenig Code um den Fehler einzugrenzen
Welchen erwartest du ?
Habe den ganzen code für das Problem gepostet hilft mir aber auch nicht.
Komme nicht dahinter warum das teil unerwartet abschmiert

AV kann nicht lesen von Addresse 00000004 immer das gleiche.
Nur damit kann ich nichts anfangen.

OpenGL kann es nicht sein denn das prüfe ich mit der CheckError Function von Lossy eX
Was er mir schon gemeldet hat war out of resources.. kann ich auch nicht verstehen
da alle texturen beim neuen einladen eines Covers gelöscht werden.
Wenn ich dann unterbreche springt er in diese zeile
Delphi-Quellcode:
if (aCovers.Count <= QuadCount) then
habe jetzt schon alles auf BMP umgestellt da ich dachte es liegt vielleicht am JPGLoader
auch die Cover sind OpenGL conform 512x512
nutzt alles nichts.

gruss Emil

EWeiss 9. Jul 2008 20:18

Re: crash in FindFile OpenGl
 
muss noch mal posten
Hab den Fehler gefunden. ;)
alte
Delphi-Quellcode:
    // fill all Quads with NoCoverTexture
    if FileExists(Path + UpperCase('Data\images\CompDisk\Default\NoCover.BMP')) then
    begin
      LoadTexture(Path + 'Data\images\CompDisk\Default\NoCover.BMP', NoCoverTexture, False);

      for q := 0  to QuadCount do
        QuadTexture[q] := NoCoverTexture;
    end else
    NoCoverTexture := 0;
neue
Delphi-Quellcode:
    // fill all Quads with NoCoverTexture
    if FileExists(Path + UpperCase('Data\images\CompDisk\Default\NoCover.BMP')) then
    begin
      LoadTexture(Path + 'Data\images\CompDisk\Default\NoCover.BMP', NoCoverTexture, False);

      for q := 0  to QuadCount -1 do
        QuadTexture[q] := NoCoverTexture;
    end else
    NoCoverTexture := 0;
Jetzt sagt mir mal jemand warum der Debuger das nicht korrekt erkennt .
Sehr traurig selbst VB6 kann das :mrgreen:

gruss Emil

Medium 11. Jul 2008 02:59

Re: crash in FindFile OpenGl
 
Schalte RangeChecks an, und schon ist der Debugger schlauer. (Nicht immer ist die Technik allein "unschlau" :P)


Edit: Altertativ nutze von vorne herein High() und Low(), dann wirst du nie nie wieder so ein Problem haben.

EWeiss 11. Jul 2008 11:43

Re: crash in FindFile OpenGl
 
Zitat:

Zitat von Medium
Schalte RangeChecks an, und schon ist der Debugger schlauer. (Nicht immer ist die Technik allein "unschlau" :P)


Edit: Altertativ nutze von vorne herein High() und Low(), dann wirst du nie nie wieder so ein Problem haben.

Jo guter tip.

gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:25 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 by Thomas Breitkreuz