Domanda

Vorrei scaricare un file da internet e immagino che questo dovrebbe essere un compito semplice. Cercando diversi diversi approcci Ho scoperto che ognuno ha il suo svantaggio. I temi principali sono:

  • applicazione si blocca fino a quando si scarica il file
  • applicazione si blocca per sempre se la connessione a Internet viene persa / server non risponde.

(dettagli:

Come recuperare un file da Internet via HTTP
la connessione non timeout durante il download di file da internet )

Quindi, alla fine ho usato i suggerimenti che ho ricevuto da più persone di utilizzare le librerie "pro" come Indy. Tuttavia, Indy non è molto meglio che i pezzi di codice che ho provato (ma è così molto più grande e difficile da mantenere). Durante l'utilizzo Indy l'applicazione non blocca solo per periodi brevi quindi è ancora (in qualche modo) utilizzabile. Tuttavia, l'applicazione non può essere chiuso fino al termine di download (mai se le connessioni Internet si rompe).

Altre persone hanno riportato lo stesso problema: http: //borland.newsgroups.archived.at/public.delphi.internet.winsock/200609/0609079112.html
https://forums.embarcadero.com/thread.jspa?threadID=25199&tstart= 90

Quindi, c'è qualche di hacking che ho dovuto fare per TIDAntiFreeze al fine di farlo funzionare?

Inoltre, la proprietà ConnectTimeout non viene riconosciuto.

fIDHTTP := TIDHTTP.Create(NIL);
fIDHTTP.ConnectTimeout:=5000;

Dovrei goccia Indy e il ritorno all'idea originaria di download in un thread separato e alla fine il filo quando non risponde (almeno in questo modo mi libero di librerie 3a parte)? Ci saranno effetti collaterali imprevisti se faccio questo?

Utilizzo:. Delphi 7, Indy 10.1.5 10.5 (probabilmente)

Grazie

È stato utile?

Soluzione

Non è troppo difficile da risolvere questo tipo di problemi. La prima cosa che dovete fare è assicurarsi di aver correttamente gestito la gestione degli errori. Se qualcosa non riesce quindi assicurarsi che tutto pulisce correttamente. Al di là che Accertarsi che il codice download è parte di un thread separato. Se c'è qualche problema si può sempre terminare il filo dal programma principale. Ecco il codice (per scaricare soltanto, non la filettatura), che sta lavorando bene per me.

with TDownloadURL.Create(nil) do
  try
    URL := 'myurltodownload.com';
    filename := 'locationtosaveto';
    try
      ExecuteTarget(nil);
    except
      result := false;
    end;
    if not FileExists(filename) then
      result := false;
  finally
    clear;
    free;
  end;

Altri suggerimenti

Probabilmente è necessario utilizzare il modo in cui Indy Indy: utilizzando thread. Indy è stato specificamente progettato per funzionare in modalità di blocco, perché è così che la maggior parte protocolli Internet di lavoro (ad esempio: con HTTP, a livello di protocollo, si invia una richiesta poi di leggere la risposta voi non inviare e ricevere allo stesso tempo.). TIdAntiFreeze si suppone che facilitano l'utilizzo di alcune funzionalità di Indy senza affrontare le discussioni; Non ho mai usato perché, almeno conceptualy, è un brutto hack.

Se non si vuole fare con le discussioni allora dovreste dare un'occhiata a ICS Link "nofollow noreferrer" per ICS home page ). ICS è stato progettato per essere utilizzato in modalità asincrona, senza filettatura. Non ha bisogno l'equivalente di TIdAntiFreeze perché non sta bloccando. Si avvia una scarica e di gestire alcuni eventi per ottenere progresso e di completamento delle notifiche. ICS è altrettanto ben noto, professionale e selvaggiamente utilizzato come Indy.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top