AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi ListView wird anscheinend vor Destroy-Aufruf zerstört
Thema durchsuchen
Ansicht
Themen-Optionen

ListView wird anscheinend vor Destroy-Aufruf zerstört

Offene Frage von "sieppl"
Ein Thema von sieppl · begonnen am 10. Okt 2004 · letzter Beitrag vom 10. Okt 2004
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#1

ListView wird anscheinend vor Destroy-Aufruf zerstört

  Alt 10. Okt 2004, 00:53
Hallo,

ich habe einen ListView-Komponente entwickelt die mit einem ThumbnailThread Thumbs aus Bildern generiert und anzeigt. In der ListView.Destroy Routine wird natürlich auch der Thread sauber beendet. Das hat beim Entwickeln der Komponente(dynamisch erzeugt) auch super geklappt. Jetzt soll die Komponente in einem größeren Projekt laufen und ich habe das Problem, dass wenn die Applikation während des Renderns beendet wird der Thread eine Zugriffsverletzung schmeißt, da er nicht mehr auf ListView.Items[x] zugreifen kann. Genau das ist ja eigentlich unmöglich, da der Thread in der Destroy-Routine heruntergefahren werden sollte.
Bei der dynamischen Erzeugung habe ich zum Beispiel in MainForm.Destroy auch ListView.Destroy aufgerufen. Das müsste doch bei den Komponenten automatisch geschehen. Was läuft da falsch???

Viele Grüße

Sebastian
Sebastian
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: ListView wird anscheinend vor Destroy-Aufruf zerstört

  Alt 10. Okt 2004, 01:40
Moin Sebastian,

ich denke mal ein wenig Sourcecode könnte hilfreich sein.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#3

Re: ListView wird anscheinend vor Destroy-Aufruf zerstört

  Alt 10. Okt 2004, 01:48
Zitat von Christian Seehase:
Moin Sebastian,
ich denke mal ein wenig Sourcecode könnte hilfreich sein.
Ich weiß, mache ich auch wann immer möglich. In diesem Fall müsste ich aber große Teile des Codes hier reinstellen und ich glaube, dass ich dann Probleme mit meinem Chef bekomme.
Ich hoffe auf einen Referenzfall..
Sebastian
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: ListView wird anscheinend vor Destroy-Aufruf zerstört

  Alt 10. Okt 2004, 01:53
Moin Sebastian,

Zitat von sieppl:
da der Thread in der Destroy-Routine heruntergefahren werden sollte.
oder auch nicht, wie's aussieht

Hast Du eine Chance das ganze mal im Einzelschritt zu testen?

BTW:
Ich würde statt des Destroy eher Free oder FreeAndNil benutzen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#5

Re: ListView wird anscheinend vor Destroy-Aufruf zerstört

  Alt 10. Okt 2004, 02:06
Erstmal vielen Dank für deinen Support trotz Code-Verweigerung.

Wie gesagt, liegt der Code nun als Komponente vor und ich rufe
Destroy nicht selber auf, es handelt sich um den überschriebenen Destruktor:

Delphi-Quellcode:
destructor TImgStdListView.Destroy;
begin
  if Assigned(FThumbnailThread) then
  begin
    SuspendThread;
    FThumbnailThread.Terminate;
    FThumbnailThread.Resume;
    WaitForSingleObject(FThumbnailThread.Handle, 3000);
  end;
  if Assigned(FDirWatcherThread) then
  begin
    FDirWatcherThread.Terminate;
    WaitForSingleObject(FDirWatcherThread.Handle, 3000);
  end;
  if Assigned(FCacheList) then
  begin
    ClearTransferList;
    FCacheList.Free;
  end;
  if Assigned(FObjectList) then
    FObjectList.Free;
  if Assigned(FMemoryInfo) then
    FMemoryInfo.Free;
  OleUnInitialize;
  inherited;
end;
Der Thread ist gerade dabei das hier auszuführen wenn der Fehler geworfen wird:

if FListView.Items[I].ImageIndex = 0 then Nur sollte Items noch vorhanden sein, solange Destroy nicht durchlaufen wurde.
Hat beim Entwickeln auch IMMER funktioniert. auch ohne Synchronize.

Grüße

Sebastian

[EDIT:]
Durchsteppen ist schwierig, da ich auf Anhieb nicht erkenne wann der ListView zerstört wird. Wo geschieht das durch eine Parent-Komponente genau?
Sebastian
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: ListView wird anscheinend vor Destroy-Aufruf zerstört

  Alt 10. Okt 2004, 02:36
Moin Sebastian,

also ohne Synchronize auf eine VCL-Kompo zuzugreifen ist, genaugenommen, sträflicher Leichtsinn

Zitat von sieppl:
Wo geschieht das durch eine Parent-Komponente genau?
gar nicht, das geschieht durch den Owner.
Der Parent ist nur für die Position zuständig.

An welcher Stelle sollte denn der Listview zerstört werden?

Zitat von sieppl:
Erstmal vielen Dank für deinen Support trotz Code-Verweigerung.
Bitte. Es gibt halt Fälle wo's eben nicht geht.

Zitat von sieppl:
habe ich zum Beispiel in MainForm.Destroy auch ListView.Destroy aufgerufen.
Zitat von sieppl:
ich rufe Destroy nicht selber auf,
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#7

Re: ListView wird anscheinend vor Destroy-Aufruf zerstört

  Alt 10. Okt 2004, 02:47
Zitat von Christian Seehase:
Zitat von sieppl:
Wo geschieht das durch eine Parent-Komponente genau?
gar nicht, das geschieht durch den Owner.
Der Parent ist nur für die Position zuständig.

An welcher Stelle sollte denn der Listview zerstört werden?
Das möchte ich ja herausfinden, da der ListView anscheinend für Items[I].ImageIndex keinen Wert mehr liefert obwohl Destroy des ListViews noch nicht durchgelaufen ist.

Zitat von Christian Seehase:
Zitat von sieppl:
habe ich zum Beispiel in MainForm.Destroy auch ListView.Destroy aufgerufen.
Zitat von sieppl:
ich rufe Destroy nicht selber auf,
Zitat von Im 1. Beitrag hat Sieppl geschrieben:
Bei der dynamischen Erzeugung habe ich zum Beispiel in MainForm.Destroy auch ListView.Destroy aufgerufen.
Das war während der Entwicklung, jetzt reden wir über eine Komponente. Kein manueller Aufruf von Destroy mehr. (Der besser hätte Free sein sollen)
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#8

Re: ListView wird anscheinend vor Destroy-Aufruf zerstört

  Alt 10. Okt 2004, 10:33
Wenn der Zugriff auf Items[I].ImageIndex vom Thread aus synchronized gemacht wird, gibt es dieselbe Zugriffsverletzung. Habe ich mir schon gedacht. (Der Aufruf Items[I].Index befindet sich nun in einer protected-Methode des ListViews.) Nur wenn ich hier vorher
Delphi-Quellcode:
if (csDestroying in ComponentState) then
  Exit;
aufrufe vermeide ich die Zugeiffsverletzung. Das ist nicht optimal und ich verstehe immer noch nicht warum die Items vor dem ListView.Destroy zerstört werden. Kann mir das mal jemand erklären?
Wie gesagt während der Entwicklung der Komponente (dynamische Erzeugung) gab es das Problem einfach nicht.
Sebastian
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: ListView wird anscheinend vor Destroy-Aufruf zerstört

  Alt 10. Okt 2004, 11:55
Moin Sebastian,

inzwischen sind mir noch ein paar Dinge aufgefallen:
Was macht SuspendThread?
Wozu noch Resume nach Terminate?
Warum verlässt Du Dich, ohne weitere Prüfung, darauf, dass WaitForSingleObject zurückkehrt weil der Thread beendet wurde?
Vielleicht ist der Return Code ja WAIT_TIMEOUT, weil der Thread noch läuft.
Wo wird der ListView erzeugt? In Deine Kompo? In diesem Falle könntest Du als Owner ja nil angeben, und den ListView gezielt nach dem Thread zerstören.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#10

Re: ListView wird anscheinend vor Destroy-Aufruf zerstört

  Alt 10. Okt 2004, 12:12
Zitat von Christian Seehase:
Moin Sebastian,

inzwischen sind mir noch ein paar Dinge aufgefallen:
Was macht SuspendThread?
SuspendThread fährt den Thread nach herunter. SuspendThread wartet auch wirklich bis der Thread Suspended ist. (mittels Delay) Das muss so sein, da der Thread Bilder rendert und es manchmal einen Augenblick dauert bis er damit fertig ist.

Zitat:
Wozu noch Resume nach Terminate?
Wenn er Suspended ist (s.o.) muss ich noch einmal fortsetzen damit auch wirklich die while-schleife verlassen wird. (while not terminated do..)

Zitat:
Warum verlässt Du Dich, ohne weitere Prüfung, darauf, dass WaitForSingleObject zurückkehrt weil der Thread beendet wurde?
der Thread wird erfahrungsgemäß innerhalb einer Sekunde beendet. Sollte er mal hängen möchte ich nicht, dass die Applikation nicht beendet wird. (via INFINITE)

Zitat:
Vielleicht ist der Return Code ja WAIT_TIMEOUT, weil der Thread noch läuft.
Wo wird der ListView erzeugt? In Deine Kompo? In diesem Falle könntest Du als Owner ja nil angeben, und den ListView gezielt nach dem Thread zerstören.
Das ist nicht der Punkt, da die Zugriffsverletzung vor dem Destroy-Aufruf erfolgt, bevor die oben erläuterten Methoden aufgerufen werden
Sebastian
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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