Newsgroup: it.comp.appl.access
Titolo: Attendere esecuzione di una function

Ciao!
È possibile fare una chiamata ad una function che restituisce true o false in funzione del codice che contiene, ma eseguire l’istruzione successiva alla chiamata SOLO dopo che il codice contenuto nella function sia stato eseguito del tutto?
 
Il problema si pone perché ho in sequenza 2 chiamate ad altrettante function, e la prima scarica un file XML che viene letto ed elaborato dalla seconda. 
A volte capita che per questioni di rete o di dimensione la seconda function parte senza che la prima abbia terminato, mandando in crash la seconda che non ha nulla da elaborare. 
 
Vorrei invece essere certo che la prima abbia terminato di scaricare. 
 
Se c’è della letteratura in rete  postate i link che me la leggo più che volentieri!
 
Grazie!!!
Landers.

fai che la prima funzione rilasci un valore True/False
 
e se True esegui la seconda

Ti ringrazio per la risposta. 
Avevo ipotizzato anch’io una soluzione simile, ma l’avevo scartata perché in ogni caso (cioè sempre), al termine della function1 devo eseguire la function2.
Solo ne caso in cui la function1 restituisca un determinato valore (es: connessione assente), allora non eseguo la 2.
Il problema è che non so a priori quanto tempo serve alla funtion1 per terminare (scaricando un file da un webservice, la durata può dipendere dalle condizioni della rete, dalle istanze che ha in corso in quel momento il server, e dalla dimensione del file che scarico). 
Ma al termine, dopo x secondi, devo sempre eseguire la function2. 
Ecco perché chiedevo come interrompere l’esecuzione del codice fino al completamente della funtion1. 
Grz. 
 
Landers


Fai un ciclo in cui cerchi se il file che stai scaricando. Finchè non esiste non esci (metti chiaramente un timeout)

Salve,
 
Ilanders ha scritto:

Cosa fai per scaricare il file? Se usi un programma esterno forse puoi 
controllare il suo Exit code che molti programmi mandono alla fine 
dell'esecuzione.
 
Lo faccio p.e. con WinScp per controllare se il download ha funzionato o 
no. Un codice di esempio sarebbe 
http://vb-tec.de/xshell.htm
 
 
L'articolo è in tedesco ma forse è abbastanza chiaro cosa succede o puoi 
usare un servizio di traduzione.
 
-- 
Ciao
Karl
*********
http://www.AccessDevCon.com
 
Access FAQ: 
http://www.donkarl.com/it
 
 
 
 

 usare un servizio di traduzione.
 
Esempi più semplici per controllare solo l'esecuzione di Shell senza 
Exit code trovi anche qui: 
http://www.donkarl.com/it?FAQ6.14
 

Spiega che codice usi per il download del file...
Se non lo esegui con un processo SINCRONO non riuscirai mai...
Se fai un download via ftp ad esempio con le api puoi implementare la funzione di callback che aggiorna la progressione del download...
 
Prova a leggere questo:
https://www.experts-exchange.com/questions/26397034/VB6-Downloading-file-with-progress-bar-and-KBP-S.html
 
 
https://stackoverflow.com/questions/1976152/download-file-vb6/1976222
 
 
http://www.vbforums.com/showthread.php?310235-VB-Downloader-Download-files-from-the-web-with-prog-bar
 
 
Ovviamente la progress Bar non serve solo a fare i giochetti... ma i valori restituiti sono indispensabili per capire se hai finito o meno..
 
@Alex


Ciao Roberto, grazie della risposta. Questa sarebbe la strada che avevo in mente anch'io e che percorrerei se non ci fosse alternativa. Le chiamo "scelte-senza-scelta", cioè quando dopo ricerche varie *io* non trovo altro modo, ma di certo elegante non è, e più di tutto, non è corretta dal punto di vista della programmazione. Ho visto che altri colleghi hanno dato altre risposte, forse lì la soluzione.


Buongiorno @Alex, grazie del tuo intervento.
Il codice che uso per scaricare è questo:
 
Public Function creaWebScarica(ByVal strURL As String) As String
    'riceve l'indirizzo a cui fare la chiamata, e restituisce il file XML
    Dim byteData() As Byte
    Dim XMLHTTP As Object
    Set XMLHTTP = CreateObject("MSXML2.XMLHTTP")
    XMLHTTP.Open "GET", strURL, False
    XMLHTTP.send
    byteData = XMLHTTP.responseBody
    Set XMLHTTP = Nothing
    creaWebScarica = StrConv(byteData, vbUnicode)
End Function
 
Ora mi leggo ben benino i link che mi hai passato, poi vi aggiorno.


Ciao Karl, grazie anche a te (vedere insieme gli interventi di @Alex e Karl è per me un onore...).
Come leggi nella risposta ad @Alex, non uso exe esterni, quindi non riesco ad intercettare il thread.
Ora mi leggo i vostri link e vi faccio sapere.
Se avete già una risposta, ovviamente non la disdegno, ma di mio di solito approfondisco sempre.
A presto.
Landers


Prova il codice indicato al LINK:
https://stackoverflow.com/questions/1976152/download-file-vb6/1976222
 
 
Usando un ADO Stream, dovrebbe diventare SINCRONO e salvare il file al termine del DOWNLOAD.
 
Sub DownloadFile(url, path)
 
   Dim objReq
   Dim objStream
 
   Set objReq = CreateObject("MSXML2.XMLHTTP")
   objReq.Open "GET", url, False
   objReq.send
 
   If objReq.Status = 200 Then
       Set objStream = CreateObject("ADODB.Stream")
       objStream.Open
       objStream.Type = 1
 
       objStream.Write objReq.ResponseBody
       objStream.Position = 0
 
       objStream.SaveToFile path, 2
       objStream.Close
       Set objStream = Nothing
   End If
 
   Set objReq = Nothing
 
End Sub
 
@Alex


In italiano suona un po' strano
6.14 Attendere fino a Shell è terminato
 
Consiglierei di cambiare
con
6.14 Attendere fino al termine di Shell
 
oppure
6.14 Attendere finche' Shell è terminato

 Exit code trovi anche qui: 
http://www.donkarl.com/it?FAQ6.14
 
 
Karl, dici che la Shell su un Download da Internet funziona...?
 
@Alex

Salve Alex,
 
@alex ha scritto:

Potrebbe funzionare almeno in parte se si tratta di un programma esterno 
che prende il controllo abbastanza lungo come WinSCP. Certo preferisco 
di leggere l'Exit code del programma come descritto per non solo sapere 
che il Shell è terminato ma con quale risultato.


Certo sulla soluzione migliore concordo pienamente.
Avevo solo qualche dubbio si potesse fare un download "diretto" da Shell e mi pare tu abbia confermato che non è fattibile.
 
Ciao Karl grazie.
 
@Alex


Ciao a tutti.
Scusate l'intermittenza, ma sono in viaggio e non sempre riesco a collegarmi.
 
Ho effettuato questi test:
 
SOLUZIONE 1:
Codice prelevato qui: 
https://www.experts-exchange.com/questions/26397034/VB6-Downloading-file-with-progress-bar-and-KBP-S.html
 
 
SOLUZIONE 2:
Codice prelevato qui: 
https://stackoverflow.com/questions/1976152/download-file-vb6/1976222
 
(proposto un un post precedente)
 
SOLUZIONE 3:
Il codice che uso attualmente (vedi mio post precedente)
 
Sto facendo debug in questo modo (che mi pare corretto):
Sul tasto "SCARICA" chiamo due function, scritta una sotto l'altra:
Function1: esegue il codice del download
Function2: - scrivo a video "eseguito" (con msgbox)
           - scrivo un una label "eseguito"
 
Quello che succede, in *tutte e tre le soluzioni* è la stessa cosa, e cioè il codice della Funtion1 viene eseguito e solo dopo una decina di secondi viene eseguito il codice della Function2.
Prima scarica il file, e poi scrive a video e nella label.
Quindi apparentemente (o forse no...) il codice viene eseguito in sequenza, aspettando il termine della function1 per poi eseguire la function2, e non come pensavo: parte la Function1, e senza attenderne la fine, parte anche la Function2.
 
Secondo voi è possibile? Oppure il debug è formalmente errato per capire cosa succede?
 
Grz!

Metti dei debug.print con il Time e verifica...
 
@Alex

 @Alex
 
Ho verificato, questi i debug.print:
 
SOL1 1 - 06:28:35
Terminato: 06:28:37
 
SOL2 1 - 06:28:47
Terminato: 06:28:49
 
SOL3 1 - 06:28:57
Terminato: 06:28:59
 
La prima riga è il codice della Funtion1 (quella che fa il download), la seconda riga è la Funtion2, eseguita in sequenza (che scrive solo "terminato", ma lo deve fare DOPO)
I 2 secondi tra i tempi sono dovuti all'istruzione sleep 2000 che ho messo nella Function1 dopo il download (è troppo veloce per ragionare in secondi, ci vorrebbero i decimi). Per conferma al posto di sleep 2000 ho anche provato a mettere un ciclo for che ripete 10 volte il download, con lo stesso risultato.
 
Sembra che la Function2 aspetti l'esecuzione completa della Function1.
 
Ora, visto che anche il codice che usavo io (SOL2) viene eseguito in successione (F2 aspetta il termine di F1) direi che il problema dei miei crash è da ricercarsi altrove.
 
Riassumendo: non ho ancora risolto il mio problema, ma almeno ho (e abbiamo dato) una risposta certa sull'argomento.
 
Grazie a tutti dell'aiuto!
Landers