Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [VB6] interropere l'esecuzione di una sub

    Salve a tutti
    Sto realizzando un software che scarica dati e/o siti da internet. Ho il problema che se la pagina o i dati non vengono trovati o non arrivano, il programma si blocca.
    Il codice che ho usato è il seguente:

    codice:
    Dichiarazioni:
    Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
        "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, _
        ByVal szFileName As String, ByVal dwReserved As Long, _
        ByVal lpfnCB As Long) As Long
        Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
    (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
    ByVal lpParameters As String, ByVal lpDirectory As String, _
    ByVal nShowCmd As Long) As Long
    
    sub
            URL = "indirizzoweb"
            localFileName = "c.\percorso di salvataggio e nome del file"
    end sub
    la sub viene richiamata da una function ma se il file non "arriva" la sub non termina più e, naturalmente, non torno più alla function chiamante.

    Volevo mettere un timer che dopo 60" costringesse la sub a terminare, ma non so cosa devo fargli fare per avere tale risultato.

    Sono certo che qualcuno di voi saprà aiutarmi

  2. #2

    Re: [VB6] interropere l'esecuzione di una sub

    Originariamente inviato da Manfre
    Salve a tutti
    Sto realizzando un software che scarica dati e/o siti da internet. Ho il problema che se la pagina o i dati non vengono trovati o non arrivano, il programma si blocca.
    Il codice che ho usato è il seguente:

    codice:
    Dichiarazioni:
    Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
        "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, _
        ByVal szFileName As String, ByVal dwReserved As Long, _
        ByVal lpfnCB As Long) As Long
        Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
    (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
    ByVal lpParameters As String, ByVal lpDirectory As String, _
    ByVal nShowCmd As Long) As Long
    
    sub
            URL = "indirizzoweb"
            localFileName = "c.\percorso di salvataggio e nome del file"
    end sub
    la sub viene richiamata da una function ma se il file non "arriva" la sub non termina più e, naturalmente, non torno più alla function chiamante.

    Volevo mettere un timer che dopo 60" costringesse la sub a terminare, ma non so cosa devo fargli fare per avere tale risultato.

    Sono certo che qualcuno di voi saprà aiutarmi
    Tralasciando il fatto che il codice postata non è completamente conforme alla spiegazione fornita, in generale per interrompere l'esecuzione di una sub è sufficiente aggiungere questa linea di codice:
    codice:
    Exit Sub
    Ovviamente gestisci l'uscita dalla sub in base alle tue esigenze (es. ricerca fallita di files, input utente non corretto..)

  3. #3
    Il codice che ho trascritto è la parte essenziale che mi crea problemi, anche perché la sub interessata non contiene molte altre istruzioni oltre a quelle riportate. Se serve sapere altro, dimmi cosa che lo riporto.
    Il fatto è che l'esecuzione pare interrompersi proprio in quelle due righe (e credo sia la prima). Anche lavorando in ambiente di sviluppo, il programma si blocca completamente assieme all'ambiente finché si chiude tutto. Inoltre, e questo l'ho omesso nella domanda con la quale ho iniziato la discussione , l'interruzione della sub dovrebbe avvenire dall'esterno della sub stessa, visto che quella che devo interrompere è ferma.

  4. #4
    Giusto per integrare informazioni sul problema.
    Di solito, quelle due istruzioni contenute nella sub, qualche cosa scaricano, anche se l'indirizzo non è corretto. Nel caso invece dovesse mancare una risposta dal server (o disconnetto la rete), il software si blocca. Quello che vorrei fare è fermare l'ostinazione di quelle istruzioni nell'aspettare una risposta a tutti i costi. Ho provato a mettere un timer che dopo 60 secondi "mi fa qualcosa", anche se per ora ho solo cercato di fare comparire una Message Box, ma non succede nulla..... e il programma si blocca comunque.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    ll problema deriva dal fatto che quella API non è asincrona e il VB6 è single threaded.

    Quindi non risolverai mai in quel modo.

    Il consiglio è di usare la API

    URLOpenPullStream
    http://msdn.microsoft.com/en-us/library/ms775128(v=vs.85).aspx

    che è asincrona.

    P.S. Nella variabile localFileName scrivi c. ma dovrebbe essere c:
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Grazie Oregon, ma il link che hai pubblicato si riferisce a un'API in C++ e pur spulciando in MSDN non ho trovato l'equivalente per il VB6
    Comunque ho capito che devo puntare ad un'altra procedura per il download dal web.
    Qualche suggerimento su un tipo di istruzione più gestibile?
    Ho visto che nelle varie discussioni ne sono presenti diversi e vorrei evitare di doverli provare tutti per capire qual'è la più adatta, non tanto ai miei scopi quanto all'usabilità del programma in generale.

    Ancora grazie

    P.S. Ho fatto solo un errore di trascrizione per la variabile LocalFileName, nel programma è corretto

  7. #7
    Ok, quasi risolto tutto utilizzando l'Internet Transfer Control , che oltretutto ha il grosso vantaggio di darmi lo stato della connessione e altre cose. Chiudo questa discussione e ne apro un'altra. Grazie a tutti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.