Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi tclientsocketnach der dateiübertagung keine freigabe der da (https://www.delphipraxis.net/83584-tclientsocketnach-der-dateiuebertagung-keine-freigabe-der-da.html)

gandime 4. Jan 2007 21:34


tclientsocketnach der dateiübertagung keine freigabe der da
 
hi,
ich verschicke mit dem tserversocket eine datei zum tclientsocket, der dann die datei normalerweise freigeben sollte was er aber nicht tut:

cs_up_up_manager:tclientsocket;

Delphi-Quellcode:
procedure TForm1.ti_up_dl_managerTimer(Sender: TObject);
var
  i_temp,i_temp2:integer;
begin
  if assigned(fstream) then
  begin
    if (i_file_size<=fstream.Position) then
    begin
      cs_up_up_manager.Active:=false;
      if not assigned(fstream) then
      begin
        ti_up_dl_manager.Enabled:=false;
      end;
    end;
  end;
end;
der timer überprüft ob die größe der datei erreicht ist und wenn ja dann wird die verbindung getrennt:

Delphi-Quellcode:
procedure TForm1.cs_up_up_managerDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  fstream:=nil;
  fstream.free;
end;
damit müsste der fstream ja freigegeben sein (die ereignisse sind ausgelöst worden vom disconnect) aber ich wenn ich die datei dann öffnen möchte sagt er mir, dass sie von einem anderen prozess verwendet wird. wenn ich das programm dann aus mache kann ich die datei öffnen
warum?

Skullschildi 4. Jan 2007 21:47

Re: tclientsocketnach der dateiübertagung keine freigabe der
 
versuch mal statt fstream:= nil; und fstream.free folgendes:
Delphi-Quellcode:
freeandnil(fstream);

Muetze1 5. Jan 2007 11:04

Re: tclientsocketnach der dateiübertagung keine freigabe der
 
Zitat:

Zitat von Skullschildi
versuch mal statt fstream:= nil; und fstream.free folgendes:
Delphi-Quellcode:
freeandnil(fstream);

Und was ändert das an seinem Problem? Es ist genau der gleiche Code wie er ihn schon hat, nur halt mit Aufruf...

@gandime: Wie versendest du die Datei? Per SendStream? Wenn ja, dann wird die Instanz freigegeben (wie in der Hilfe angegeben), aber der Socket setzt dir die Instanzenadresse nirgendwo auf Nil. Das kann er auch gar nicht, da er nicht alle möglichen Plätze und Variablen kennt, welche sich auf den Stream beziehen um sie mit Nil zu füllen.

Wenn du die Verbindungen direkt nach dem Versand schließen möchtest, dann sende die Datei selber (also Blockweise dem Socket übergeben) und dann weisst du ja, wann du fertig bist und kannst entsprechend reagieren.

gandime 6. Jan 2007 02:25

Re: tclientsocketnach der dateiübertagung keine freigabe der
 
iwie verstehe ich das nicht so ganz wie das gehen soll
erstmal ja ich verschicke die datei via sendstream und wie soll das dann genau gehen, dass die datei freigegeben wird?

auserdem wenn ich freeandnil(fstream) mache kommt des öfteren eine fehlermeldung!

SirThornberry 6. Jan 2007 09:08

Re: tclientsocketnach der dateiübertagung keine freigabe der
 
@Mütze: Der unterschied ist das der Stream erst frei gegeben wird und dann erst auf nil gesetzt wird. Im Ausgangspost wird die Instanzvariable aber erst auf nil gesetzt und dann die Methode Free aufgerufen. Da der Instanzzeiger dann aber nicht mehr auf den reservierten Speicher zeigt wird nichts frei gegeben und es ensteht ein Memoryleck.

gandime 6. Jan 2007 14:21

Re: tclientsocketnach der dateiübertagung keine freigabe der
 
@SirThornberry

hey danke so gehts :)


und den anderen natürlich auch

Muetze1 6. Jan 2007 16:25

Re: tclientsocketnach der dateiübertagung keine freigabe der
 
@SirThomberry: sorry, habe das übersehen, stimmt. Ich nehme alles darauf bezugnehmend zurück.

@gandime: Das ist Stuss - sorry wenn ich das so sage. Ich habe dir schon oben geschrieben, dass SendStream die Instanz übernimmt und selber freigibt, wenn er die Datei gesendet hat. Er sendet die Datei asynchron im Hintergrund und daher weisst du nie, wann er fertig ist. Wenn du ihm die Dateinstanz freigibst, dann greift er beim einlesen von Daten (da er vllt. noch beim Senden ist), ins Nirvana und bekommen eine Fehlermeldung. Ich habe dir schon oben geschrieben, dass du die Instanz nicht freigeben sollst. Genauso ist es in der Hilfe eindeutig geschrieben.

Ich weiss nicht was man noch schreiben soll. Schau in die Hilfe, folge vllt. meinen Vorschlägen von oben, aber bitte beschwere dich nicht, dass es bei grösseren Dateien komischerweise wieder zu komischen Zugriffsverletzungen kommt oder kaputte Dateien ankommen.


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