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 :

Thread pour afficher dans une CListCtrl


Sujet :

MFC

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut Thread pour afficher dans une CListCtrl
    Salut

    J'ai un probleme que j e n'arrive pas à régler.. Je developpe une application qui lis de très grands fichers logs (+1GB) et affiche chaque ligne (trace du log) dans une CListCtrl (en utilisant InsertRow). L'appli permet aussi de rechercher une trace specifique dans le grand fichier log. L'affichage marche parfaitement quand on ne recherche pas une trace, ou quand la trace à recharcher est au début du fichier. Mais quand il faut rechercher une trace qui se trouve par exemple vers la fin d'un ficher de 2GB, cela prend trop de temps. Et pendant ce temps, si on essaie de faire n'importe quoi sur la fenêtre dialog de l'appli, ca bloque.

    Il faut probablement créer une thread independente pour rechercher dans le fichier et faire un InsertRow dans la CListCtrl si la trace est trouvée. Cela permettra que la fenêtre dialog reste controllable sans qu'elle ne bloque au moindre Move ou Exit. Mais je ne sais pas comment créer une thread pour afficher dans le CListCtrl.

    Merci pr votre aide! Je pourrai poster mon code si cela aide à comprendre le cas!

  2. #2
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    la question est comment créer un thread c'est ca ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Ben oui, surtout que cette thread crée et la thread principale auront que je le veuille ou pas accès à CListCtrl. La thread principlae y ausr accès car c'est un contrôle dans le dialog, et la 2eme thread aura accès parce qu'elle doit faire un InsertRow a la CListCtrl.

    Aussi, comment est ce que je pourrai passer des variables ou parametres d'un thread a l'autre?

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    http://c.developpez.com/faq/vc/?page=ProcessThread
    attention à ne pas mélanger thread et gui

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Dans ma 2eme thread, j'ai creé un array. Cette thread remplit l array avec des CString à travers une while loop. Comment faire pour passer l'array a la thread principale apres que la while loop se termine?

  6. #6
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Points : 138
    Points
    138
    Par défaut
    Salut,
    A ton thread tu peux passer des paramètres, par exemple ton tableau.
    Le mieux serait d'avoir ton tableau en membre de ta fenêtre.
    Une fois ton thread terminé, tu envoi un message privé à ta fenêtre pour lui dire que c'est terminé. Sur réception de ce message ta fenêtre rempli sa liste avec son tableau membre.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    D'accord, mais comment retourner les valeurs du tableau rempli par la 2eme thread à la thread principale?

  8. #8
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Points : 138
    Points
    138
    Par défaut
    Lorsque tu envois un message à une fenêtre via la fonction PostMessage, tu retourne dans le thread propriétaire de la fenêtre, dans ton cas tu retourneras dans le thread principal.
    Le tableau est membre de ta fenêtre, tu le passes à ton thread lors de sa création.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Je ne comprends pas. Le tableau est membre de ma 2eme thread, donc je doit passer le tableau a la thread pricnipale. Je fais ça avec PostMessage? Mais les arguments de PostMessage sont PARAM etc.. et non pas arg[][].

    J'ai essayé de faire le contraire, créer un tableau membre de ma thread principale, et le passer a la 2eme thread (en utilisant InIt..() ° mais ca ne marche pas.

  10. #10
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AfxBeginThread(XYZ ,2e Parametre ,THREAD_PRIORITY_NORMAL) ;

    le 2e parametre est un argument qui arrive dans le thread

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UINT TheThread(LPVOID pParam/*2e parametre ici*/)
    {
     
    ::PostMessage((HWND)pParam,WM_MY_MSG_PRIVE,0,0) ;
     
    return 0 ;
    }
    donc tu peux passer ce que tu veux au thread donc soit une structure soit une class du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct threadParam
    {
    HWND phwnd;
    CArray* pArray;
    }

  11. #11
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Points : 138
    Points
    138
    Par défaut
    Ton CListCtrl se trouve dans une fenêtre qui appartient au thread principal.
    Tu le remplis en utilisant un tableau qui (c'est plus logique comme ça) est membre de cette même fenêtre.
    A partir de ta fenêtre, dans le OninitDialog par exemple, tu lances ton second thread qui se chargera de remplir ton tableau.
    Une fois que le thread a terminé de remplir le tableau, il fait un postmessage sur ta fenêtre pour lui indiquer qu'elle peut remplir la liste en utilisant le tableau membre qui vient d'être rempli.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CWinThread* AfxBeginThread(
       AFX_THREADPROC pfnThreadProc, //. fonction du thread
       LPVOID pParam, //. parametres à passer a la fonction
       int nPriority = THREAD_PRIORITY_NORMAL, //. priorite
       UINT nStackSize = 0,
       DWORD dwCreateFlags = 0,
       LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL 
    );
    Donc tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CPtrList *pto_Liste_Params = new CPtrList; //. liste de pointeurs à passer au thread
     
    pto_Liste_Params->AddTail(&monTableau); //. tableau à remplir en premier
    pto_Liste_Params->AddTail(GetSafeHwnd())//. handle de la fenêtre pour faire le postmessage
     
    AfxBeginThread((AFX_THREADPROC)MaFonctionDeRemplissage,pto_Liste_Params);
    Ensuite dans le thread, tu castes le void *qui est en paramètre en (CPtrList*) et tu peux récupérer ce qu'il y a dans la liste apres.

    Et à la fin du thread tu envoies un message qu handle qu tu avais dans la liste.

    Voilà j'espère que c'est assez clair.

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Qu'est ce aue tu veux dire par

    "...tu castes le void *qui est en paramètre en (CPtrList*) ..." ?

  13. #13
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Points : 138
    Points
    138
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    UINT MaFonctionDeRemplissage(LPVOID pParams)
    {
    CPtrList *pto_Liste = (CPtrList*)pParams;
    //. apres acces a la liste pour recuperer les elements.
     
    //. a la fin destruction de la liste
    delete pto_Liste;
     
    }

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Comment je recupere les elements?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monTableau=pto_Liste_Params->GetTail()
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monTableau2=pto_Liste_Params->monTableau
    ??

    Les 2 ne marchent pas!

    Excusez moi, mais je suis tres nouveau dans tout ca!!

    Merci

  15. #15
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Points : 138
    Points
    138
    Par défaut
    Tu sais que tu as deux éléments dans ta liste.
    Tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //. premier element
    //. find index retourne la position de l'élément n
    MonElement *pto_Element =
    (MonElement*)pto_Liste->GetAt(pto_Liste->FindIndex(0));
     
    //. deuxieme element
    MonElement2 *pto_Element =
    (MonElement2*)pto_Liste->GetAt(pto_Liste->FindIndex(1));
    Voila ou alors tu peux utiliser les méthode GetHead() et GetTail() à la place de GetAt().

Discussions similaires

  1. Fusionner deux tables pour afficher dans une même table
    Par mychan dans le forum DBDesigner
    Réponses: 3
    Dernier message: 12/08/2013, 09h20
  2. Attribut en session pour afficher dans une page JSP
    Par stanilas dans le forum Struts 2
    Réponses: 1
    Dernier message: 24/09/2012, 14h08
  3. Réponses: 62
    Dernier message: 16/04/2009, 10h09
  4. Réponses: 14
    Dernier message: 05/05/2008, 15h35
  5. Texte trop long pour afficher dans une combobox
    Par bavmorda1 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/02/2008, 13h42

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