Lire un fichier web en C++ avec wxWidgets

Lire un fichier web en C++ avec wxWidgets - C++ - Programmation

Marsh Posté le 04-10-2004 à 14:41:42    

Bonjour,  
J'ai écrit une fonction en C++ avec wxWidgets pour récupérer une page Web. Mon problème, c'est que la lecture d'un ensemble de fichiers est fortement ralentie par des serveurs down ou très lents / surchargés. La fonction passe alors son temps à attendre. Je souhaiterai donc pouvoir mettre un time out à la lecture du fichier ou à défaut ajouter une fonction préalable qui teste l'accessibilité de la page à récupérer.  
Par contre je ne vois pas du tout comment faire.  
Quelqu'un peut-il m'éclairer ?
Merci d'avance pour les idées : le code source actuel est en dessous.  
RV.  
 

Citation :


bool readflux (wxString filename, wxString *filecontent)
{
    wxInputStream *in_stream = NULL;
    int ReadMode             = 1;
 
    // DEBUT LECTURE DU FICHIER DISTANT    
    filename = wxURL::ConvertToValidURI( filename );
    wxURL url(filename);
     
 if ( url.GetError() != wxURL_NOERR )
 {
     // erreur : problème lors de l'analyse de l'URL
        return false;
    }    
 
    wxChar *data = NULL;
    size_t size  = 0;
 
    try  
    {
        // essai pour ouvrir le flux
        in_stream = url.GetInputStream();  
    }
    catch (...)
    {
        // erreur : problème à l'ouverture du flux RSS.
        return false;
    }
     
    //////////////////////////////////////////////////
    if ( in_stream )
    {
        // le fichier distant a pu être ouvert
        try  
        {
             size = in_stream->StreamSize();
        }
        catch (...)
        {
             // erreur : la demande de la taille du fichier a causé une erreur.
             ReadMode = 2;
        }
    }
    else
    {
        // le fichier distant n'a pas pu être ouvert
        return false;
    }
    //////////////////////////////////////////////////    
 
    //////////////////////////////////////////////////    
    // certains fichiers http renvoient leur taille => on passe par Read
    // d'autres renvoient -1 => on passe par GetC (ce est plus lent)
    if ((int)size > 0)
        ReadMode = 1;
    else
        ReadMode = 2;
    //////////////////////////////////////////////////
     
    //////////////////////////////////////////////////
    wxString temp;
    if (ReadMode==1)
    {
        if (size > 0)
            try  
            {
                 data = new wxChar[size];
            }
            catch (...)
            {
                 // erreur : la création du conteneur a échoué
                 return false;
            }
        else
        {
            // le fichier est de taille nulle ou indéterminée.
            return false;
        }
         
        try
        {
             // essai de lire dans le flux
             if (!in_stream->Read(data, size))
             {
                 // la lecture du fichier distant a échoué
                 if (in_stream)   delete in_stream;
                 if (data)        delete data;                        
                 return false;
             }
             else
             {
                 wxString _data (data, size);
                 temp = _data;
                 // la lecture du fichier distant a réussi
             }  
        }
        catch (...)
        {
            if (in_stream)   delete in_stream;
            if (data)        delete data;
            return false;
        }    
    }
    else
    {
        try
        {
            char c; size = 0;
            do
            {
                c=in_stream->GetC();
                size++;  
                temp.Append (c);        
            }
            while (in_stream->LastRead()>0);
        }
        catch (...)
        {
            // erreur a la lecture du fichier caractere par caractere
            if (in_stream)   delete in_stream;
            if (data)        delete data;
            return false;
        }
    }
     
    // liberation memoire
    if (in_stream)   delete in_stream;
    if (data)        delete data;
    // FIN LECTURE FICHIER DISTANT
    *filecontent = temp;
    return true;
}


 
Cordialement.

Reply

Marsh Posté le 04-10-2004 à 14:41:42   

Reply

Marsh Posté le 29-07-2005 à 23:20:58    

Salut,
 
Essaye de pinger le serveur ou est situe la page tu sauras si il est up.
Pour le time out mets une tampo apres la demande d'acces au site.


---------------
ce serait bien si ce serait mieux
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed