probleme de pointeur

probleme de pointeur - C++ - Programmation

Marsh Posté le 07-04-2005 à 13:42:22    

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
Reply

Marsh Posté le 07-04-2005 à 13:42:22   

Reply

Marsh Posté le 07-04-2005 à 14:05:07    

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();


Reply

Marsh Posté le 07-04-2005 à 14:38:41    

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
Reply

Marsh Posté le 07-04-2005 à 15:05:16    

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

Reply

Marsh Posté le 07-04-2005 à 15:22:17    

ouai mais on mas pas rtepondu


---------------
debian sib sur asus a6va peut etre prochainement un freebsd
Reply

Marsh Posté le 07-04-2005 à 15:47:45    

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...

Reply

Marsh Posté le 07-04-2005 à 16:29:21    

ok j'essaie


---------------
debian sib sur asus a6va peut etre prochainement un freebsd
Reply

Marsh Posté le 07-04-2005 à 16:32:31    

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
Reply

Marsh Posté le 07-04-2005 à 16:50:20    

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

Reply

Marsh Posté le 07-04-2005 à 16:53:03    

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
Reply

Marsh Posté le 07-04-2005 à 16:53:03   

Reply

Marsh Posté le 07-04-2005 à 16:58:24    

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.

Reply

Marsh Posté le 07-04-2005 à 17:12:05    

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
Reply

Marsh Posté le 07-04-2005 à 17:25:26    

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
Reply

Marsh Posté le 07-04-2005 à 17:26:13    

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
Reply

Marsh Posté le 07-04-2005 à 17:31:23    

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 ?

Reply

Marsh Posté le 07-04-2005 à 17:33:53    

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.

Reply

Marsh Posté le 07-04-2005 à 17:34:50    

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
Reply

Marsh Posté le 07-04-2005 à 17:37:37    

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 ?

Reply

Marsh Posté le 07-04-2005 à 17:39:52    

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.

Reply

Marsh Posté le 07-04-2005 à 17:43:29    

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
Reply

Marsh Posté le 07-04-2005 à 17:50:05    

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
Reply

Marsh Posté le 07-04-2005 à 17:51:39    

oui mais l'initialisé a quoi


---------------
debian sib sur asus a6va peut etre prochainement un freebsd
Reply

Marsh Posté le 07-04-2005 à 17:56:35    

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

Reply

Marsh Posté le 07-04-2005 à 17:58:36    

dreamkiller a écrit :

oui mais l'initialisé a quoi


 
c'est pas moi qui vais savoir :D

Reply

Marsh Posté le 07-04-2005 à 17:59:51    

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à...

Reply

Marsh Posté le 07-04-2005 à 23:17:01    

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
Reply

Marsh Posté le 08-04-2005 à 08:22:30    

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.

Reply

Marsh Posté le 08-04-2005 à 09:00:30    

[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
Reply

Marsh Posté le 08-04-2005 à 09:50:14    

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
Reply

Marsh Posté le 08-04-2005 à 09:56:12    

:jap:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed