wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

Membres en ligne : 0
Invités en ligne : 2

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» wxURL dans un wxThread, appelé depuis un wxDialog impossible?
Conversation : wxURL dans un wxThread, appelé depuis un wxDialog impossible?
02-08-2012 12:45:43  wxURL dans un wxThread, appelé depuis un wxDialog impossible? #1
starmate (Membre)
Inscrit le : 28-06-2011
Messages: 23
Snippets: 1
Tutoriels: 0
Hors ligne
Bonjour,

Je viens vers vous pour vous soumettre un problème. Je suis en train d'essayer de créer un wxDialog permettant de télécharger un fichier (avec progress bar). Du coup, pour ne pas bloquer mon application, j'ai créé un thread avec le Entry suivant:

Code Cpp:

 
////////.......//////
while ((bytesread = (int)(pIn_Stream->Read(&buf, WXSIZEOF(buf))).LastRead()) > 0 && m_bIsDownload && !TestDestroy() )
            {
                file.Write((const void *)&buf, bytesread);
                nCount += bytesread;
                if (m_bNotifyDownloading && (nCount%m_nNotifyBytes) == 0 && nCount>=m_nNotifyBytes)
                {
                    event.SetDownLoadStatus(wxDownloadEvent::DOWNLOAD_INPROGRESS);
                    event.SetDownLoadedBytesCount(nCount);
                    m_pParent->GetEventHandler()->AddPendingEvent( event );
                }
            }
////////.......//////
if (nCount < m_nFileSize){
                fail = true;
            }
 
            file.Close();
            delete pIn_Stream;
            if (fail) {
                event.SetDownLoadStatus(wxDownloadEvent::DOWNLOAD_FAIL);
            } else {
                event.SetDownLoadStatus(wxDownloadEvent::DOWNLOAD_COMPLETE);
            }
 


Et lors du clic sur le bouton télécharger dans mon wxDialog, j'ai ceci:

Code Cpp:

 
////////////........//////////////
m_pThread = new wxDownloadFile(this, file_url, save_path_location, true, 1000);
    if ( m_pThread->Create() != wxTHREAD_NO_ERROR )
    {
        wxLogError("Can't create the thread!");
        delete m_pThread;
        m_pThread = NULL;
    }
    else
    {
        if (m_pThread->Run() != wxTHREAD_NO_ERROR )
        {
            wxLogError("Can't create the thread!");
            delete m_pThread;
            m_pThread = NULL;
        }
    }
////////////........//////////////
 


Pour info, la majorité de mon cote à été téléchargé depuis ce lien

Le problème que j'ai est que lorsque je télécharge un fichier (19Mo), le thread se bloque 1 fois sur 10 env (sous MSW). Il s'arrête juste avant que le téléchargement soit terminé.

Alors j'ai modifié wxThread(wxTHREAD_DETACHED) par wxThread(wxTHREAD_JOINABLE) ce qui avait l'air de super bien marcher, sauf que c'est le cas lorsque je test l'application depuis netbeans mais lorsque je lance l'application en autonome, ce n'est pas du tout le cas.

J'avoue que c'est un vrai mystère pour moi.

Ps: à l'origine j'avais développé un code de mes 10 doigs, avec le même résultat.

Serait-ce wxWidgets 2.9.4 qui contient un bug ou serait-ce moi même qui bugerai? ;) J'espère en tout cas que quelqu'un pourra éclairer ma lanterne car je ne vois vraiment pas d'où peut venir le problème. Même mon ami google n'a pas pu m'aider :s

Ha oui, pour finir, le code marche à peu près bien sous MSW, preque jamais sous GTK et je dois tester sous MAC... Et aussi, je dev une application 32 bit sur une machine 64 bit avec gcc, sous windows (Mingw).

Jonathan
----------
Je vous propose les sources de la version modifiée que j'utilise.
J'ai inséré la possibilité d'utiliser du buffer lors des téléchargements te c'est pour cette raison que je me permets de vous envoyer cette version

Dernière modification par starmate (02-08-2012 14:28:46)

02-08-2012 15:43:04  Re: wxURL dans un wxThread, appelé depuis un wxDialog impossible? #2
starmate (Membre)
Inscrit le : 28-06-2011
Messages: 23
Snippets: 1
Tutoriels: 0
Hors ligne
Bon... Il semblerait que j'ai trouvé une solution... Maintenant ça fonctionne sous windows, mais je dois encore tester sous GTK et OSX.
Voici la nouvelle version.

Comme j'ai repris le travail de quelqu'un d'autre, j'ai laissé son copyright en haut du code. J'ai tout de même modifié des choses, comme:
    - l'utilisation de wxFileOutputStream au lieu de wxFile
    - l'utilisation de buffer pour soulager le CPU
    - l'utilisation de wxTHREAD_JOINABLE au lieu de wxTHREAD_DETACHED
    - l'ajout de vérifications supplémentaires permettant de confirmer que le fichier téléchargé soit correct
    - et d'autres broutilles...

Donc voila, si quelqu'un est intéressé, il n'aura qu'à télécharger le fichier ci-dessus. Ce sera quant même plus léger que wxCurl ;)

Jonathan
----------
Petite précision, sous Linux, j'ai un beau segmentation fault (core dump) de temps à autre.
Pour le moment je n'ai pas le temps de chercher la raison du problème, mais j'ai effectuer des tests sous MSW, OSX et GTK et dans l'ensemble, le résultat est satisfaisant.

Si vous avez la moindre remarque ou le moindre conseil à me donner, n'hésitez pas! ;)

Dernière modification par starmate (02-08-2012 17:04:08)

02-08-2012 18:45:51  Re: wxURL dans un wxThread, appelé depuis un wxDialog impossible? #3
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Salut.

Je n'ai pas trop le temps de regarder le code, mais je me souviens par contre avoir eut un petit soucis avec le mélange sockets/threads.

Il faut en fait initialiser les sockets depuis le thread principal pour qu'ils soient complètement accessibles et opérationnels depuis des threads secondaires.

Pour effectuer cette initialisation, un simple "wxSocketBase::Init" ou un truc de ce genre suffisait.

De mémoire, c'était sous wx-é.8.x, alors je ne sais pas si la même chose est nécessaire sous wx-2.9

Je regarderais le code en détails quand je rentrerai de ouacances... :lol:

@+
Xav'

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» wxURL dans un wxThread, appelé depuis un wxDialog impossible?