IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[MFC] Problème avec affichage d'un gif et fonction bloquante


Sujet :

MFC

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 84
    Points : 46
    Points
    46
    Par défaut [MFC] Problème avec affichage d'un gif et fonction bloquante
    Bonjour à tous !

    J'ai un problème assez complexe alors je vais essayer d'être le plus clair possible.

    J'ai un activeX qui permet de tranférer du contenu entre un serveur Http et le disque de l'utilisateur. Jusqu'ici tout va bien ...

    Pour cela j'utilise la bibliothèque WinHttp pour me connecter au serveur. Afin d'afficher la progression du transfert, j'affiche une boite de dialogue avec un texte et un gif animé.

    Pour cela j'utilise la classe CPictureEx de CodeGuru (celle faite avec les MFC) : http://www.codeproject.com/bitmap/pictureex.asp.
    Donc en gros je lance ma méthode download qui affiche ma boite de dialogue et qui se connecte à mon serveur.

    Le problème est que les fonctions de connection de WinHttp sont bloquantes notamment la fonction WinHttpReceiveResponse et donc mon gif animé ne l'est plus du tout.

    J'ai essayé d'utiliser des threads mais je n'arrive pas à comprendre ce que je dois mettre en Thread, le rafraichissement de la boite de dialogue ? la fonction WinHttpReceiveResponse ?

    De plus je me suis aperçu que la classe CPictureEx utilisée une thread pour afficher le gif animé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    m_hThread = (HANDLE) _beginthreadex(NULL,0,_ThreadAnimation,this,
    			CREATE_SUSPENDED,&nDummy);
    Ya t'il un moyen de rendre cette thread plus "prioritaire" ?

    J'espère avoir été assez clair et je vous remercie par avance de vos remarques.

    A+

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    moi je mettrais les fonctions de transfert dans un thread pour ne pas geler l'interface.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 84
    Points : 46
    Points
    46
    Par défaut
    Ok mais j'ai du mal à voir ce que je peux mettre dans le thread.

    Je t'explique l'entrelacement des fonctions.

    - A partir du javacript, j'appelle une méthode appelée ExportFile :
    - La méthode ExportFile appelle une méthode privée appelée Download(url) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CString download(CString cUrl, CString cPath)
    - C'est cette méthode download qui appelle l'affichage de ma boite de dialogue en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    myProgrBar = new CProgressBar();
    	if(myProgrBar != NULL)
       {
    	   BOOL ret = myProgrBar ->Create(IDD_PROGRESSBAR);
          if(!ret)   //Create failed.
    		  AfxMessageBox(GetResString(4));
       }
    et qui en plus se connecte au serveur et rappatrie le contenu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    LPSTR pszData = _T("WinHttpWriteData Example");
        DWORD dwBytesWritten = 0;
        BOOL  bResults = FALSE;
        HINTERNET hSession = NULL,
                  hConnect = NULL,
                  hRequest = NULL;
     
        // Use WinHttpOpen to obtain a session handle.
        hSession = WinHttpOpen(  L"A WinHTTP Example Program/1.0", 
                                 WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
                                 WINHTTP_NO_PROXY_NAME, 
                                 WINHTTP_NO_PROXY_BYPASS, 0);
     
        // Specify an HTTP server.
        if (hSession)
            hConnect = WinHttpConnect( hSession, L"www.wingtiptoys.com",
                                       INTERNET_DEFAULT_HTTP_PORT, 0);
     
        // Create an HTTP Request handle.
        if (hConnect)
            hRequest = WinHttpOpenRequest( hConnect, L"GET",wRequest, 									NULL,WINHTTP_NO_REFERER, 
    						WINHTTP_DEFAULT_ACCEPT_TYPES, 0);
     
        // Send a Request.
        if (hRequest) 
            bResults = WinHttpSendRequest( hRequest, 
                                           WINHTTP_NO_ADDITIONAL_HEADERS, 0,
                                           WINHTTP_NO_REQUEST_DATA, 0, 
                                           strlen(pszData), 0);
     
     
        // End the request.
        if (bResults)
            bResults = WinHttpReceiveResponse( hRequest, NULL);
     
        //puis téléchargement
     
        // Report any errors.
        if (!bResults)
            printf("Error %d has occurred.\n",GetLastError());
     
     
        // Close any open handles.
        if (hRequest) WinHttpCloseHandle(hRequest);
        if (hConnect) WinHttpCloseHandle(hConnect);
        if (hSession) WinHttpCloseHandle(hSession);
    tu créérai un thread par méthode WinHttp (genre WinHttpSendRequest, WinHttpReceiveResponse ?) et si c'est le cas, comment je fais pour qu'il utilise le même objet, l'objet hRequest par exemple ?

    Merci d'avance

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    oui a ta question ,
    tu peux faire transiter des infos au thread à sa creation : une structure un pointeur un handle ce que tu veux ..
    voir faq:
    http://c.developpez.com/faq/vc/?page...keWorkerThread

Discussions similaires

  1. [MFC] Problème avec un splitter
    Par julien.nasser dans le forum MFC
    Réponses: 9
    Dernier message: 24/05/2006, 15h00
  2. Problème avec affichage d'une table modifiée
    Par auriolbeach dans le forum Access
    Réponses: 6
    Dernier message: 31/10/2005, 15h45
  3. Réponses: 5
    Dernier message: 10/05/2005, 10h22
  4. [MFC] Problème avec un RichEdit et couleur
    Par Erakis dans le forum MFC
    Réponses: 1
    Dernier message: 24/03/2005, 14h12
  5. [MFC] problème avec les insertions dans CComboBox
    Par Joeleclems dans le forum MFC
    Réponses: 12
    Dernier message: 11/06/2004, 15h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo