Autor Téma: Jak správně zastavit stahování přes FTP ve vlákně (Synapse) ?  (Přečteno 711 krát)

(T)lama

  • Host
Stahuju soubor pomocí tohoto kóud :

 
Citace
Citovat:
procedure TStahniVlakno.Execute;
begin
FTP := TFTPSend.Create;
FTP.TargetHost:='127.0.0.1';
FTP.TargetPort:='21';
FTP.UserName:='***';
FTP.Password:='***';
FTP.Login;
FTP.DSock.OnStatus := prubeh_form.SockCallBack;
FTP.RetrieveFile(downloadsoubor,true);
FTP.DSock.OnStatus := nil;
FTP.Logout;
ftp.DataStream.SaveToFile(downloadsoubor);
ftp.Destroy;
end;


Na zastavení vlákna používám
 
Citace
Citovat:
procedure TStahniVlakno.Zastav;
begin
Exit;
end;

Zastavení stahování řeším tímto kódem

 
Citace
Citovat:
procedure Tprubeh_form.Button1Click(Sender: TObject);
begin
StahniVlakno.ftp.DSock.OnStatus := nil;
StahniVlakno.ftp.DSock.StopFlag := true;
StahniVlakno.ftp.Abort;
StahniVlakno.ftp.Logout;
StahniVlakno.ftp.Destroy;
StahniVlakno.Zastav;
end;

Ale při zastavování vyskočí chyba Access violation. Kde mám chybu v ukončovacím kódu?

Koukal

  • Host
Jak správně zastavit stahování přes FTP ve vlákně (Synapse) ?
« Odpověď #1 kdy: 11-04-2006, 10:09:00 »
Dobry den

Pokud inicializujete objekt      .Create
domnivam se, ze ma byt ukoncen   . Free a ne destroy

viz napoveda delphi  :

When an exception is raised during creation of an object, Destroy is automatically called to dispose of the unfinished object. This means that Destroy must be prepared to dispose of partially constructed objects. Because a constructor sets the fields of a new object to zero or empty values before performing other actions, class-type and pointer-type fields in a partially constructed object are always nil. A destructor should therefore check for nil values before operating on class-type or pointer-type fields.

---------------------------------------------------------------------------------
 Calling the Free method (defined in TObject ), rather than Destroy, offers a convenient way of checking for nil values before destroying an object.
--------------------------------------------------------------------------------

ftp.Destroy;                // ?????????????
StahniVlakno.ftp.Destroy;   // ?????????????

Petr koukal


(T)lama

  • Host
Jak správně zastavit stahování přes FTP ve vlákně (Synapse) ?
« Odpověď #2 kdy: 11-04-2006, 19:44:00 »
To destoy jsem změnil na free, ale pořád to můj problém neřeší. Zkoušel jsem postupně zakomentovávát řádky ukončovacíh kódu, pak jsem vyzkoušel zakomentovat celý kód ve vláknu a dát tam místo toho

 
Citace
Citovat:
repeat
Inc(i)
until i = 5000;


a zjistil jsem že pokud při činnosti vlákna zavolám něco od vlákna, např

 
Citace
Citovat:
ShowMessage(BoolToStr(StahniVlakno.Suspended))
tak vyskočí chyba Access Violation. Kde tedy dělám chybu, Že pokaždé pokud chci něco od vlákna v době činnosti vyskočí chyba?

Semi

  • Host
Jak správně zastavit stahování přes FTP ve vlákně (Synapse) ?
« Odpověď #3 kdy: 14-04-2006, 15:02:00 »
Neni problem ve Free nebo Destroy, ale v tom, ze se Destroy zavola 2x !
To je zasadni chyba.

V lepsim pripade to zpusobi exception, v horsim pripade tam mezitim bude jiny objekt a znicite ho omylem - to se pak velmi spatne dohledava, kdyz to pak ukazuje chybu nekde jinde, nez se predtim stala...
Kód: [Vybrat]
procedure TObject.Free;
begin
  if (Self<>nil) then
    Destroy;
end;

Jedina vyhoda Free oproti Destroy je v tom, ze to neudela exception, kdyz dostane NIL. Kdyz dostane pointer ruzny od NIL, ktery (uz) neni platny objekt, tak je to stejne spatne...
(Dalsi vyhoda je o par bytes kratsi volani Free oproti virtualnimu Destroy...)