[MFC] Plantage sur un AfxGetMainWnd()->Invalidate();

Plantage sur un AfxGetMainWnd()->Invalidate(); [MFC] - C++ - Programmation

Marsh Posté le 03-04-2005 à 00:49:40    

Bonsoir a tous voila j'ai un ptit probleme sur la fonction AfxGetMainWnd()->Invalidate() de mon prog ca me cause un plantage generalisé voila si qq a une idée
 
 

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


 
 
merci de votre aide :hello:


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

Marsh Posté le 03-04-2005 à 00:49:40   

Reply

Marsh Posté le 03-04-2005 à 00:56:20    

Cette fonction est-elle un thread ? Parce que, si cela fonctionne comme Qt, les éléments de l'UI ne peuvent pas être manipulés par un autre thread que celui de l'UI et il faut passer par des événements personalisés.

Reply

Marsh Posté le 03-04-2005 à 01:03:04    

ouai c'est bien un thread  :sweat:  
 
Et tu entend quoi par événements personnalisés :??:


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

Marsh Posté le 03-04-2005 à 01:05:45    

si ton pObject est utilisé par plusieurs threads faudrait voir a le protéger par une section critique, les CString sont assez  chatouilleuses sur les accès concurents.
 
Si ca ne vient pas de ca, essaie d'utiliser RedrawWindow à la place de Invalidate.
 
Si ca ne résoud toujours pas le problème poste un message à ta mainwindow et gère le rafraichissement de ta fenetre dans le handler de ce message.

Reply

Marsh Posté le 03-04-2005 à 01:09:41    

nan j'ai qu un thread et les CString son modifier seulement ici donc pas de prob
pour le redraw j'essaye de suite


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

Marsh Posté le 03-04-2005 à 01:10:44    

meme erreur  :pt1cable:


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

Marsh Posté le 03-04-2005 à 01:10:46    

dreamkiller a écrit :

nan j'ai qu un thread


 
et le thread principal de ton appli il compte pas ?

Reply

Marsh Posté le 03-04-2005 à 01:12:55    

la fonction pour envoyer un message c'est bien PostMessage mais je fais comment pour le recevoir et rafraichir apres :??:


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

Marsh Posté le 03-04-2005 à 01:22:48    

dreamkiller a écrit :

Et tu entend quoi par événements personnalisés :??:


Je voulais parler des messages, désolé j'ai perdu le vocabulaire Win32  :whistle: En plus tu dois pouvoir envoyer un message WM_PAINT si mes souvenirs sont bons...
Si ça ne marche pas, pour recevoir le message je pourrais pas t'aider beaucoup... Peut-être que le code de cette page te donnera des indices: http://www.codeproject.com/dialog/idledialog.asp

Reply

Marsh Posté le 03-04-2005 à 01:27:51    

tu te déclare une méthode  

Code :
  1. afx_msg void Toto(WPARAM,LPARAM);


 
et tu edites ta message map :

Code :
  1. BEGIN_MESSAGE_MAP(CTestInvalidateDlg, CDialog)
  2. /* ..... */
  3. ON_MESSAGE(WM_USER+1, Toto)
  4. END_MESSAGE_MAP()


 
sinon envoyer WM_PAINT n'est pas une bonne idées :
http://msdn.microsoft.com/library/ [...] w_88ac.asp
"
The WM_PAINT message is generated by the system and should not be sent by an application
"

Reply

Marsh Posté le 03-04-2005 à 01:27:51   

Reply

Marsh Posté le 03-04-2005 à 01:31:25    

je galere a envoyé un message
 
je croit que c'est du type  
 
CIhmDlg fen1.PostMessage(WM_PAINT);
 
mais j'suis pas sur qq peut t'il eclairer ma lanterne :jap:


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

Marsh Posté le 03-04-2005 à 01:32:43    

SquiZZ a écrit :

tu te déclare une méthode  

Code :
  1. afx_msg void Toto(WPARAM,LPARAM);


 
et tu edites ta message map :

Code :
  1. BEGIN_MESSAGE_MAP(CTestInvalidateDlg, CDialog)
  2. /* ..... */
  3. ON_MESSAGE(WM_USER+1, Toto)
  4. END_MESSAGE_MAP()


 
sinon envoyer WM_PAINT n'est pas une bonne idées :
http://msdn.microsoft.com/library/ [...] w_88ac.asp
"
The WM_PAINT message is generated by the system and should not be sent by an application
"


et je la declare ou la methode???


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

Marsh Posté le 03-04-2005 à 01:34:15    

ahem.. oops, désolé de l'erreur :/ ...

Reply

Marsh Posté le 03-04-2005 à 01:35:56    

dreamkiller a écrit :

et je la declare ou la methode???


DTC?  
 

Reply

Marsh Posté le 03-04-2005 à 01:36:02    

pas grave ca arrive :)  
Au point ou j'en suis toutes les solutins me semble bonne  :D


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

Marsh Posté le 03-04-2005 à 01:37:43    


a c'est d'une finesse :heink:


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

Marsh Posté le 03-04-2005 à 01:40:20    

dreamkiller a écrit :

a c'est d'une finesse :heink:


 
 :pfff:  
essaie de reflechir un peu.
Ou tu peut la déclarer à ton avis ?
dans la classe de la fenetre que tu veux rafraichir par exemple, ca me semblerait pas mal, non ?

Reply

Marsh Posté le 03-04-2005 à 01:44:52    


 :o :o  :o  :o  :o  :o  
excuze moi si je cale rien mais j'ai jamais crée de message.
J ai toujours utilisé les messages par default
 
 
et je sais pas quoi faire de mon BEGIN_MESSAGE_MAP


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

Marsh Posté le 03-04-2005 à 01:48:51    

t'y fais rien, tu rajoutes juste le ON_MESSAGE() kivabien dans la message map qui existe déjà entre BEGIN_MESSAGE_MAP et END_MESSAGE_MAP
 

Reply

Marsh Posté le 03-04-2005 à 11:47:23    

erreur de linkage
 
PC ControleDlg.obj : error LNK2001: unresolved external symbol "protected: void __thiscall CPCControleDlg::Toto(unsigned int,long)" (?Toto@CPCControleDlg@@IAEXIJ@Z)
 


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

Marsh Posté le 03-04-2005 à 12:14:54    

tu ouvres ton fichier cpp et dedans tu ajoutes

Code :
  1. void CPCControleDlg::Toto(WPARAM,LPARAM)
  2. {
  3. // mettre du code ici
  4. }


 
t'as des notions de C ou de C++ ou tu tappes au hazard sur les touches de ton clavier ?

Reply

Marsh Posté le 03-04-2005 à 16:23:48    

reste calme reste calme :fou:  :fou:  
 
si tu me donne moitier des infos aussi deja que je sais pas a quoi corresponde WPARAM et LPARAM


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

Marsh Posté le 03-04-2005 à 16:31:40    

et l'envoi du message c'est ca ou pas
 
CPCControleDlg fen1;
fen1.PostMessage(WM_USER+1);


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

Marsh Posté le 03-04-2005 à 19:19:41    

WPARAM et LPARAM sont des données que tu peux spécifier quand tu fais ton PostMessage
par exemple

Code :
  1. AfxGetMainWnd()->PostMessage(WM_USER+1, 13, 42)


 
 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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