| Autor |
Beitrag |
AndreM
      
Beiträge: 122
Win2k, WinXP, Suse 10
D7 Ent
|
Verfasst: 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? 
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| var OldMode: Byte; begin OldMode:=FileMode; FileMode:=fmShareDenyNone; (...) 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 
      
Beiträge: 122
Win2k, WinXP, Suse 10
D7 Ent
|
Verfasst: 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
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Mi 03.12.03 13:57
Korrigiere - man sollte Objekte nie mit Destroy sondern immer nur mit Free freigeben!
Delphi-Quelltext
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
AndreM 
      
Beiträge: 122
Win2k, WinXP, Suse 10
D7 Ent
|
Verfasst: Mi 03.12.03 15:19
| Motzi hat folgendes geschrieben: | Korrigiere - man sollte Objekte nie mit Destroy sondern immer nur mit Free freigeben!
Delphi-Quelltext |
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! 
|
|
barfuesser
      
Beiträge: 324
|
Verfasst: 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!  |
In diesem Fall würde ich diese Komponente wahrscheinlich meiden.
barfuesser
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 04.12.03 12:37
Also die Überprüfung des Self-Pointers entspricht einem simplen:
Delphi-Quelltext 1: 2: 3:
| test eax,eax jz +$07 |
(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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: 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!
|
|