Autor Beitrag
AndreM
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Win2k, WinXP, Suse 10
D7 Ent
BeitragVerfasst: Mi 03.12.03 08:57 
Hallo Community,

ich habe folgendes Problem. Und zwar lade ich mit Hilfe der Internet Component Suite welcher man unter overbyte.delphicenter.com/frame_index.html finden kann ein Bild aus dem Internet herunter.
Das ganze funktioniert auch ohne wirklich große Probleme wenn man das Prinzip erstmal verstanden hat. Nur habe ich jetzt das Problem das ich das Bild, bevor ich nicht das komplette Programm beendet habe, nicht nutzen kann da es irgendwie im Zugriff bleibt und erst von der Procedure freigegeben wird wenn das Programm komplett beendet wird.

Wenn ich trotzdem versuche das Bild in einer Image-Komponete zu laden kommt nur die Fehlermeldung das die Datei nicht geöffnet werden kann.

Weiß einer Rat? :D
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 03.12.03 09:44 
Titel: Shared Zugriff
Hallo!

Du musst nur FileMode auf fmShareDenyNone setzen. (Falls Du öfter Dateizugriffe in deiner Anwendung machst, solltest Du sie dann zurücksetzen.)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var OldMode: Byte;
begin
    OldMode:=FileMode;
    FileMode:=fmShareDenyNone;
    //auf diese Zeile kommt es an
    (...)
    //hier eigenen Quelltext einfügen
    FileMode:=OldMode;
end;


Das sollte eigentlich funktionieren, es sei denn die Bild-Ladefunktion ignoriert FileMode...

In diesem Fall solltest Du die Datei mit CopyFile kopieren (und ggf. ebenfalls FileMode setzen) und dann die Kopie öffnen.

Viel Erfolg,
S.J.
AndreM Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Win2k, WinXP, Suse 10
D7 Ent
BeitragVerfasst: Mi 03.12.03 13:24 
Nach mehreren Stunden suche hab ich jetzt auch endlich die Lösung gefunden.

Nach dem GET mußte man noch ein

RcvdStream.Destroy;
und
RcvdStream := nil;

machen! Dann läuft es!!!
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mi 03.12.03 13:57 
Korrigiere - man sollte Objekte nie mit Destroy sondern immer nur mit Free freigeben!
ausblenden Delphi-Quelltext
1:
RcvdStream.Free;					

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
AndreM Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Win2k, WinXP, Suse 10
D7 Ent
BeitragVerfasst: Mi 03.12.03 15:19 
Motzi hat folgendes geschrieben:
Korrigiere - man sollte Objekte nie mit Destroy sondern immer nur mit Free freigeben!
ausblenden Delphi-Quelltext
1:
RcvdStream.Free;					

Funktioniert auch.

Ich hatte auf der Seite des Entwicklers jedoch ein Beispielprogramm gefunden und dort wurde das Objekt auch mit Destroy freigegeben! Und da dacht ich mir der Entwickler wirds schon wissen! :D
barfuesser
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 324



BeitragVerfasst: Mi 03.12.03 17:18 
AndreM hat folgendes geschrieben:
Ich hatte auf der Seite des Entwicklers jedoch ein Beispielprogramm gefunden und dort wurde das Objekt auch mit Destroy freigegeben! Und da dacht ich mir der Entwickler wirds schon wissen! :D

In diesem Fall würde ich diese Komponente wahrscheinlich meiden.

barfuesser
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 04.12.03 11:42 
Titel: Zu Destroy vs. Free
Hallo!

Der Unterschied besteht darin, dass mit Destroy zwar das Objekt zwar aus dem Speicher entfernt wird, vorher allerdings keine Überprüfung stattfindet, ob es überhaupt noch existiert. Wenn das Objekt also bereits mit Destroy entfernt wurde, resultiert das in einem Fehler!

Free prüft einfach vorher, ob das Objekt noch existiert und ruft nur dann Destroy auf. Wenn man also ein Objekt in einer Methode auf jeden Fall nur einmal erstellt und am Ende einmal entfernt, kann man ruhig Destroy benutzen.

Bei rekursiven Aufrufen zum Beispiel, die nicht sauber programmiert sind, könnte das einen Fehler geben. Ebenso, wenn man zum Beispiel ein Destroy nicht immer aufruft, sondern es in einer If Bedingúng stehen hat.

Dehalb: Wenn man sicher ist, dass das Objekt noch besteht und dass der Aufruf an der Stelle richtig ist, kann man ruhig Destroy benutzen.

MfG,
S.J.
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Do 04.12.03 11:54 
Naja.. Free überprüft nicht ob das Objekt noch existiert, sondern lediglich ob der Self-Pointer nil ist. Enthält der Self-Pointer noch eine Referenz auf ein Objekt, das jedoch gar nicht mehr existiert, so schlägt auch diese Überprüfung fehl!

Du hast zwar recht, wenn man sich sicher ist, dass das Objekt existiert kann man es auch mit Destroy freigeben, aber ich finde solche Differenzierungen verwirren nur, daher empfehle ich generell immer Free zu verwenden...

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 04.12.03 12:00 
Titel: Geschwindigkeit!
Hallo!

@Motzi: Free braucht etwas länger!

Ich meinte übrigens schon die Pointer-Überprüfung, wollte das aber nicht vertiefen, weil das normalerweise das selbe ist...

Aber zu der generellen Verwendung von Free: Wenn man das nur einmal benutzt, macht das keinen spürbaren Unterschied, das ist schon richtig. Ich habe das jedoch auch z.B. in rekursiven Aufrufen (mit mehreren tausend Funktionsaufrufen) benutzt. Dort kann man dann doch spürbare Unterschiede erhalten.

Deshalb: Im Allgemeinen bin ich Deiner Meinung, wer aber das letzte Quenthen Geschwindigkeit herausholen möchte, sollte sich im Einzelfall entscheiden!

MfG,
S.J.
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Do 04.12.03 12:37 
Also die Überprüfung des Self-Pointers entspricht einem simplen:
ausblenden Delphi-Quelltext
1:
2:
3:
  test  eax,eax
  jz    +$07 // falls Self = nil ans Ende springen (Destroy nicht aufrufen)
  // aufruf von Destroy

(entspricht dem compilierten Delphi-Code von TObject.Free)
Und das diese 2 simplen ASM-Befehle so einen großen Unterschied machen kann ich mir nun doch nicht ganz vorstellen...

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 04.12.03 14:07 
Titel: Doch
Hallo!

Also, ich hab das mit meinem Programm jetzt mal ausgemessen!
Insgesamt macht das bei mir immerhin 1,230 Sekunden aus...

(Nach ca. 900000 Durchläufen)

Damit erhöht sich die Verarbeitungsgeschwindigkeit in meinem Fall von ca. 6,6 auf 7,8 Sekunden!

Das ist für mich schon Optimierungsgrund genug! (Der Schleifeninhalt besteht übrigens ansonsten fast nur aus ASM-Code...)

Gruß,
S.J.
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Do 04.12.03 20:00 
Ok, aber solche Extremfälle sind wohl eher selten der Fall...

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!