Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1716 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  probleme de pointeur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

probleme de pointeur

n°1038798
dreamkille​r
Posté le 07-04-2005 à 13:42:22  profilanswer
 

Salut a tous bon voila j'ai un probleme de pointeur apparament il est mal initialisé et me plante dans les pates des que je m'en sert
 

Code :
  1. INT ThreadHorloge(LPVOID pParam)
  2. {
  3. CHologe* pObject = (CHologe*)pParam;
  4. CTime horloge /*= CTime::GetCurrentTime()*/;
  5. int nHeure;
  6. int nMin;
  7. int nSec;
  8. while(pObject->m_bFin!=true)
  9. {
  10.  horloge = CTime::GetCurrentTime();
  11.  nHeure=horloge.GetHour();
  12.  nMin=horloge.GetMinute();
  13.  nSec=horloge.GetSecond();
  14.  pObject->m_strHeure.Format("%d",nHeure);
  15.  pObject->m_strMin.Format("%d",nMin);
  16.  pObject->m_strSec.Format("%d",nSec);
  17.  pObject->m_pDialog->Invalidate();             //ici
  18.  Sleep(1000);
  19. }
  20. return 1;
  21. }


 
declaration du pointeur
 

Code :
  1. CPCControleDlg *m_pDialog;


 
initialisation
 

Code :
  1. m_pDialog=NULL;


---------------
debian sib sur asus a6va peut etre prochainement un freebsd
mood
Publicité
Posté le 07-04-2005 à 13:42:22  profilanswer
 

n°1038816
SomeBugsIn​Me
life suxx
Posté le 07-04-2005 à 14:05:07  profilanswer
 

Quand tu arrives dans ta fonction m_pDialog est-il toujours NULL ?
Si c'est le cas, tu ne peux pas faire m_pDialog->Invalidate()
 
tu peux faire :
 

Code :
  1. if (p_Object->m_pDialog) pObject->m_pDialog->Invalidate();


n°1038849
dreamkille​r
Posté le 07-04-2005 à 14:38:41  profilanswer
 

ouai il est tj nul
 
ouai mais t as solution ne sert a rien ici il ne fait jamais de invalidate


Message édité par dreamkiller le 07-04-2005 à 14:44:30

---------------
debian sib sur asus a6va peut etre prochainement un freebsd
n°1038897
IrmatDen
Posté le 07-04-2005 à 15:05:16  profilanswer
 

salut,
Il me semble que c'est le même topic que là, non ?
http://forum.hardware.fr/forum2.ph [...] subcat=386

n°1038940
dreamkille​r
Posté le 07-04-2005 à 15:22:17  profilanswer
 

ouai mais on mas pas rtepondu


---------------
debian sib sur asus a6va peut etre prochainement un freebsd
n°1038997
IrmatDen
Posté le 07-04-2005 à 15:47:45  profilanswer
 

tiens je t'ai trouvé ça : http://www.mvps.org/vcfaq/mfc/11.htm et le lien qu'il y a en bas de la page est aussi à voir. Pour mieux comprendre, utilise la msdn...

n°1039057
dreamkille​r
Posté le 07-04-2005 à 16:29:21  profilanswer
 

ok j'essaie


---------------
debian sib sur asus a6va peut etre prochainement un freebsd
n°1039063
dreamkille​r
Posté le 07-04-2005 à 16:32:31  profilanswer
 

ouai mais pour le hwnd j'ai besoin d'un pointeur sur la fenetre d'affichage donc retour case depart


---------------
debian sib sur asus a6va peut etre prochainement un freebsd
n°1039114
IrmatDen
Posté le 07-04-2005 à 16:50:20  profilanswer
 

au lieu de faire de pParam un pointeur vers ta classe CHorloge, tu en fais un pointeur vers un hWnd...

n°1039119
dreamkille​r
Posté le 07-04-2005 à 16:53:03  profilanswer
 

pourquoi passé par pParam??? moiu j'ai tapé ca  
 

Code :
  1. ::PostMessage(pObject->m_pDialog->hwnd, MY_WM_INVALIDATE, (WPARAM)0, (LPARAM)0);


---------------
debian sib sur asus a6va peut etre prochainement un freebsd
mood
Publicité
Posté le 07-04-2005 à 16:53:03  profilanswer
 

n°1039126
IrmatDen
Posté le 07-04-2005 à 16:58:24  profilanswer
 

aussi... du moment que ça marche c'est l'essentiel... Mais le fait de passer un pointeur vers un HWND t'empêche d'appeler une quelconque fonction membre ayant une incidence sur le thread de l'UI.

n°1039150
bjone
Insert booze to continue
Posté le 07-04-2005 à 17:12:05  profilanswer
 

pourquoi un thread ?
 
tu crées un Timer qui va t'envoyer un message qui va te faire rafraichir ton bouzin.


Message édité par bjone le 07-04-2005 à 17:12:13
n°1039168
dreamkille​r
Posté le 07-04-2005 à 17:25:26  profilanswer
 

IrmatDen a écrit :

aussi... du moment que ça marche c'est l'essentiel... Mais le fait de passer un pointeur vers un HWND t'empêche d'appeler une quelconque fonction membre ayant une incidence sur le thread de l'UI.


 
 
ouai mais le prob c'est que justement c'est mon pointeur qui plante!?!


---------------
debian sib sur asus a6va peut etre prochainement un freebsd
n°1039169
dreamkille​r
Posté le 07-04-2005 à 17:26:13  profilanswer
 

dans ce cas la je fais mon horloge aussi dans un timer c'est pas une solution


---------------
debian sib sur asus a6va peut etre prochainement un freebsd
n°1039177
IrmatDen
Posté le 07-04-2005 à 17:31:23  profilanswer
 

dreamkiller a écrit :

ouai mais le prob c'est que justement c'est mon pointeur qui plante!?!


D'après ton code, non c'est pas ton pointeur qui plante mais l'utilisation que tu en fais !!
Et le coup du timer, pourquoi c'est pas une solution ?

n°1039182
bjone
Insert booze to continue
Posté le 07-04-2005 à 17:33:53  profilanswer
 

si c'est LA solution.
 
tu as un évenement qui t'arrives périodiquement quand tu dois actualiser quelque chose.
 
ce que tu fais est ultra-classique y'a pas besoin de thread avec un sleep dedans pour actualiser une horloge dans une interface.

n°1039184
dreamkille​r
Posté le 07-04-2005 à 17:34:50  profilanswer
 

je persiste a croire que c'est mon pointeur
 
pObject->m_pDialog->mClock.GetHeure(); cette ligne plante a l'execution (mClock donne membre de la classe qui contient mon thread)


---------------
debian sib sur asus a6va peut etre prochainement un freebsd
n°1039186
bjone
Insert booze to continue
Posté le 07-04-2005 à 17:37:37  profilanswer
 

si ton pointeur est NULL oui y'a déjà ça.
 
mais après, au moment de l'appel à invalidate() es-tu que tout ce qui se passe soit thread-safe ?

n°1039191
bjone
Insert booze to continue
Posté le 07-04-2005 à 17:39:52  profilanswer
 

sinon ton "CPCControleDlg *m_pDialog", on est d'accord qu'il est bien dans ta classe CHologe, et que tu n'en as pas d'autres ailleurs.
 
poste le code de la création du thread, voir comment tu initialises le CHorloge passé en paramètre au thread.

n°1039196
dreamkille​r
Posté le 07-04-2005 à 17:43:29  profilanswer
 

tennez pas compte des commentaires c'est des essai
 
.cpp

Code :
  1. CHologe::CHologe(/*CPCControleDlg *pDialog*/ /*CString a*/)
  2. {
  3. m_pTHreadHorloge=AfxBeginThread(ThreadHorloge,this,THREAD_PRIORITY_LOWEST);
  4. m_pTHreadHorloge->m_bAutoDelete=false;
  5. // m_pDialog=pDialog;
  6. // CString test=a;
  7. m_pDialog=NULL;
  8. m_bFin=false;
  9. }
  10. CHologe::~CHologe()
  11. {
  12. m_bFin=true;
  13. }
  14. UINT ThreadHorloge(LPVOID pParam)
  15. {
  16. CHologe* pObject = (CHologe*)pParam;
  17. CTime horloge /*= CTime::GetCurrentTime()*/;
  18. int nHeure;
  19. int nMin;
  20. int nSec;
  21. while(pObject->m_bFin!=true)
  22. {
  23.  horloge = CTime::GetCurrentTime();
  24.  nHeure=horloge.GetHour();
  25.  nMin=horloge.GetMinute();
  26.  nSec=horloge.GetSecond();
  27.  pObject->m_strHeure.Format("%d",nHeure);
  28.  pObject->m_strMin.Format("%d",nMin);
  29.  pObject->m_strSec.Format("%d",nSec);
  30. // pObject->m_pDialog->Invalidate();
  31. // if (pObject->m_pDialog) pObject->m_pDialog->Invalidate();
  32.  //::InvalidateRect(hwnd, NULL, TRUE);
  33.  //::PostMessage(pObject->hwnd, MY_WM_INVALIDATE, (WPARAM)0, (LPARAM)0);
  34.  pObject->m_pDialog->mClock.GetHeure();
  35.  Sleep(1000);
  36. }
  37. return 1;
  38. }
  39. CString CHologe::GetHeure()
  40. {
  41. return m_strHeure;
  42. }
  43. CString CHologe::GetMin()
  44. {
  45. return m_strMin;
  46. }
  47. CString CHologe::GetSec()
  48. {
  49. return m_strSec;
  50. }


 
.h
 

Code :
  1. #include "PC ControleDlg.h"
  2. #if !defined(AFX_HOLOGE_H__E8178F81_42E7_442A_9C7F_A0A51303DEB2__INCLUDED_)
  3. #define AFX_HOLOGE_H__E8178F81_42E7_442A_9C7F_A0A51303DEB2__INCLUDED_
  4. #if _MSC_VER > 1000
  5. #pragma once
  6. #endif // _MSC_VER > 1000
  7. #define MY_WM_INVALIDATE  (WM_APP + 1)
  8. class CPCControleDlg;
  9. class CHologe 
  10. {
  11. public:
  12. CString GetSec();
  13. CString GetMin();
  14. CString GetHeure();
  15. CString m_strMin;
  16. CString m_strHeure;
  17. CString m_strSec;
  18. CHologe(/*CPCControleDlg *pDialog*/);
  19. CPCControleDlg *m_pDialog;
  20. virtual ~CHologe();
  21. friend UINT ThreadHorloge(LPVOID pParam);
  22. private:
  23. bool m_bFin;
  24. CWinThread *m_pTHreadHorloge;
  25. HANDLE m_hThreadHorloge;
  26. HWND hwnd;
  27. };
  28. #endif // !defined(AFX_HOLOGE_H__E8178F81_42E7_442A_9C7F_A0A51303DEB2__INCLUDED_)


---------------
debian sib sur asus a6va peut etre prochainement un freebsd
n°1039203
bjone
Insert booze to continue
Posté le 07-04-2005 à 17:50:05  profilanswer
 

alors déjà:
 

Code :
  1. * CHologe::CHologe(/*CPCControleDlg *pDialog*/ /*CString a*/)
  2.     * {
  3.     *   
  4.     *     m_pTHreadHorloge=AfxBeginThread(ThreadHorloge,this,THREAD_PRIORITY_LOWEST);   
  5.     *     m_pTHreadHorloge->m_bAutoDelete=false;
  6.     * //    m_pDialog=pDialog;
  7.     * //    CString test=a;
  8.     *     m_pDialog=NULL; 
  9.     *     m_bFin=false;
  10.     * }


 
quand AfxBeginThread() crée le thread, si il donne tout de suite un timeslice, le thread va commencer à s'éxécuter avec des données CHorloge non initialisés, et le pObject->m_pDialog->mClock.GetHeure() se fera avec un "m_pDialog" à pseudo-rien, ni à NULL ni à autre chose de désiré.
 
ie faire plustôt:
 

Code :
  1. CHologe::CHologe(/*CPCControleDlg *pDialog*/ /*CString a*/)
  2.     * {
  3.     *   
  4.     * //    m_pDialog=pDialog;
  5.     * //    CString test=a;
  6.     *     m_pDialog=NULL; 
  7.     *     m_bFin=false;
  8.     *     m_pTHreadHorloge=AfxBeginThread(ThreadHorloge,this,THREAD_PRIORITY_LOWEST);   
  9.     *     m_pTHreadHorloge->m_bAutoDelete=false;
  10.     * }


 
surtout le m_pDialog qui doit être initialisé à autre chose que NULL, sinon kaboum....


Message édité par bjone le 07-04-2005 à 17:51:33
n°1039205
dreamkille​r
Posté le 07-04-2005 à 17:51:39  profilanswer
 

oui mais l'initialisé a quoi


---------------
debian sib sur asus a6va peut etre prochainement un freebsd
n°1039215
bjone
Insert booze to continue
Posté le 07-04-2005 à 17:56:35  profilanswer
 

dans le doute tu peux aussi créer ton thread avec un:
 
AfxBeginThread(ThreadHorloge,this,THREAD_PRIORITY_LOWEST,0,CREATE_SUSPENDED);
 
et faire un ResumeThread() pour lancer le thread un fois que tu as terminé tes initialisations.
 
comme spécifié à: http://msdn.microsoft.com/library/ [...] nct_18.asp

n°1039218
bjone
Insert booze to continue
Posté le 07-04-2005 à 17:58:36  profilanswer
 

dreamkiller a écrit :

oui mais l'initialisé a quoi


 
c'est pas moi qui vais savoir :D

n°1039220
bjone
Insert booze to continue
Posté le 07-04-2005 à 17:59:51  profilanswer
 

mais comme je te dis, l'approche du thread est une mauvaise approche pour ce que tu veux faire.
 
tu crées un Timer, tu mappes le message du timer sur ta fonction qui va bien et puis voilà...

n°1039533
dreamkille​r
Posté le 07-04-2005 à 23:17:01  profilanswer
 

et comment on fiat un timer (et oui j'suis tributaire de mes cours d'info et ca c'est pas dans mes cours)


---------------
debian sib sur asus a6va peut etre prochainement un freebsd
n°1039623
Lam's
Profil: bas.
Posté le 08-04-2005 à 08:22:30  profilanswer
 

dreamkiller a écrit :

et comment on fiat un timer


Bah tu vas là:  http://www.google.com/microsoft
Et tu tapes "timer". Faut pas prendre le 1er choix (qui est en .NET), mais le 2ème. C'est quand même pas compliqué, nan ? (comme d'hab, y a même un exemple dedans, et la doc est très lisible)  
 
Ou sinon, un bête google sur "msdn timer" donne ça en première page:
http://www.codeproject.com/system/timers_intro.asp
 

dreamkiller a écrit :

(et oui j'suis tributaire de mes cours d'info et ca c'est pas dans mes cours)


Pas du tout. Tu crois qu'on connais tous les APIs par coeur, ou qu'on garde jalousement nos polys de cours 10 ans après l'obtention du diplôme, même pour coder des trucs abscons ?  
 
Bah nan. Pour être efficace dans la vie, faut savoir chercher (c'est aussi un truc à apprendre: comment trouver la bonne info de la bonne manière). En l'occurence, tu es gâté, la programmation sous Windows est hyper bien documentée sur la MSDN, et on trouve un milliard d'exemples sur le net. Donc, Google est ton ami.

n°1039653
dreamkille​r
Posté le 08-04-2005 à 09:00:30  profilanswer
 

[ouai j'ai realisé que j'avais dit une connerie :D  dsl merci quand memem


---------------
debian sib sur asus a6va peut etre prochainement un freebsd
n°1039710
dreamkille​r
Posté le 08-04-2005 à 09:50:14  profilanswer
 

ouai ca marche :bounce:  :bounce:  :bounce:  :bounce:  :bounce:  :bounce:  :bounce:  :bounce:  :bounce:  :bounce:
 
merci beaucoup la solution timer en faite n'etait pas une mauvaise idee


---------------
debian sib sur asus a6va peut etre prochainement un freebsd
n°1039719
bjone
Insert booze to continue
Posté le 08-04-2005 à 09:56:12  profilanswer
 

:jap:

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  probleme de pointeur

 

Sujets relatifs
Problème avec pointeur dans une structureProblème de typage de pointeur de pointeur
[MFC/VC++] Problème de pointeurproblème de pointeur sur fonction
[C] problème de pointeurprobleme pointeur void alors qu'un cast de char* marche :\
probleme avec pointeur sur objetProblème de pointeur... (oui, je sais.)
[C] Liste chaînée / pointeur : problème !probleme pour comparer le contenu d'un pointeur et un valeur!!
Plus de sujets relatifs à : probleme de pointeur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR