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
    Membre habitu�
    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
    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 : 41
    Localisation : France

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

  3. #3
    Membre habitu�
    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
    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
    Par d�faut
    http://c.developpez.com/faq/vc/?page=ProcessThread
    attention � ne pas m�langer thread et gui

  5. #5
    Membre habitu�
    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
    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 �prouv�
    Inscrit en
    Avril 2004
    Messages
    122
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    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
    Membre habitu�
    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
    Par d�faut
    D'accord, mais comment retourner les valeurs du tableau rempli par la 2eme thread � la thread principale?

  8. #8
    Membre �prouv�
    Inscrit en
    Avril 2004
    Messages
    122
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    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
    Membre habitu�
    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
    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 Expert
    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
    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 �prouv�
    Inscrit en
    Avril 2004
    Messages
    122
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    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
    Membre habitu�
    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
    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 �prouv�
    Inscrit en
    Avril 2004
    Messages
    122
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    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
    Membre habitu�
    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
    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 �prouv�
    Inscrit en
    Avril 2004
    Messages
    122
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    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