Newsgroup: it.comp.lang.visual-basic
Titolo: RE wininet

Ho fatto un programmino che comprime i dati e poi li trasmette in FTP.
Sono finalmente riuscito ad usare l'istruzione "InternetSetStatusCallback"
per controllare lo stato di avanzamento in un form tramite una barra di
riempimento.
Questo form però è insensibile ad ogni mia richiesta, cioè aprendo un
pulsante di annulla, se viene selezionato non succede nulla.
Ho anche inserito un filmatino avi per dare la sensazione del trasferimento,
ma non si anima.
Qualcuno può aiutarmi?
Grazie
Sergio

 ma non si anima.
Per cominciare, hai specificato - tramite la funzione InternetOpen() - che
si tratta di un processo asincrono ? Se non l'hai fatto, il processo è
comunque sincrono e della callback non te ne fai niente.
Che funzione stai usando per leggere/scrivere ?
Se stai usando FtpGetFile() o FtpPutFile() ritengo che sia
praticamente impossibile in VB ottenere un processo asincrono.
Sarebbe necessario creare un evento associato e utilizzare poi
WaitForSingleObject() in un thread separato dall'applicazione
principale. Se questo è semplice in C++ e ancora più con MFC,
in VB vedo poche strade percorribili.
Questo perché la callback viene vista dal sistema, in questi casi,
come parte dell'applicazione principale e quindi anch'essa soggetta
al blocking.
Se sei in questa situazione, prendi spunto dall'esempio che ti avevo
fatto e usa le funzioni InternetReadFile() e InternetWriteFile().
Sono funzioni che possono essere considerate sincrone, ma se utilizzate
come ti avevo descritto, non dovrebbero causare blocchi.
Spero che la tua Callback, InternetStatusCallback(), non sia stata
inserita a livello di form. Se è così spostala in un modulo; un modulo
di classe è meglio.
Un consiglio: usa la callback solo con InternetConnect(), così da permettere
all'applicazione di valutare i tempi di connessione, di terminarla in caso di
timeout e di mostrare a video le fasi della connessione.
Per la lettura/scrittura, comportati come se stessi scrivendo un
file su disco.


Sergio

 l'istruzione FtpPutFile?
E' scritto sopra.
Con questa FtpPutFile() è complicato ottenere un processo non-blocking
appunto perché sarebbe necessario utilizzare un thread separato dalla
applicazione principale per la gestione degli eventi per ottenere un
risultato soddisfacente. Anche un utilizzo pesante di DoEvents() potrebbe
non essere d'aiuto.
Se credi, posso passarti il listato C++ di un processo che utilizza
FtpPutFile() per capire meglio cosa intendo.
C'è un'altra considerazione.
FtpPutFile(), se non usata nella maniera corretta, può causare
l'overloading del server FTP, con conseguente blocco totale
del lato client e/o del lato server. C'è un articolo su questa questione
nel sito microsoft - nel Web Workshop se non sbaglio.

Ciao Jimi,
ho provato in molti modi a far trasmettere dati tramite il servizio FTP.
Sia nel modo che suggerisci tu, sia nel modo FtpPutFile, i dati vengono
trasmessi bene.
Ho aggiunto al tuo modo, un UpdatePicStatus che visualizza una barra a
scorrimento e funziona.
Nel modo FtpPutFile, chiamo una routine dove anche in questa c'è questo
metodo che funziona pure lui.
Quello che non funziona in tutti e due i modi è che se seleziono la croce di
chiusura della finestra, questa non fa niente, anzi, se lascio delle
finestre aperte e voglio poterci andare durante il trasferimento di un file,
queste non si attivano, e lo fanno solo quando il processo è terminato.
Sergio

 queste non si attivano, e lo fanno solo quando il processo è terminato.
E' evidente dunque che il problema nasce da un difetto del processo.
Se la finestra che contiene la barra di progresso non è direttamente
coinvolta nel processo (ie. il codice risiede in un modulo), non ci sono
motivi apparenti che giustifichino il blocco.
Se credi, posta il codice incriminato o al limite mandami il progetto.
Ciao