programmation windows -> fenetre et thread

programmation windows -> fenetre et thread - C++ - Programmation

Marsh Posté le 21-11-2003 à 10:04:18    

Bonjour tout le monde,
 
Avant tout je vous previens que je fais du python qui utilise des fonctions C++ mais le probleme est bien un probleme de programmation windows en c++.  
 
Voici le probleme:
 
J'ai un programme 'toto' qui lance plusieurs thread (appellons les A, B et C) dont un (le B) qui est chargé de l'affichage d'une fenetre windows.
 
Le thread B boucle sur la fonction PumpMessages() qui recupere tous les messages windows et se termine dans le cas d'un message WM_QUIT.
 
A un moment donné je veux arreter le thread B (et donc fermer la fenetre) a partir de C (qui a evidemment un lien sur B).
 
Donc depuis C j'appelle une fonction destroy ( C.destroy())
 
et cette fonction destroy contient un appelle a la fonction de l'API WIN32 DestroyWindow.
 
Et bien ca marche pas. Mon retour (python):
pywintypes.error
(0, 'DestroyWindow', 'No error message is available')
 
Ou est le hic?
 
J'ai aussi essayé d'appeller la fonction PostQuitMessage(0) mais dans ce cas il ne se passe rien.
 
Merci par avance de vos nombreuses reponses!
 
Christophe

Reply

Marsh Posté le 21-11-2003 à 10:04:18   

Reply

Marsh Posté le 21-11-2003 à 12:10:09    

LEs messages de ta fenetre sont envoyes a ton thread B et non pas C.
Donc si tu appelles les fonctions DestroyWindow ou PostQuitMessage dans C, c'est normal que ta fenetre ne se ferme pas.
 
edit : A thread cannot use DestroyWindow to destroy a window created by a different thread
et
The PostQuitMessage function posts a WM_QUIT message to the thread's message queue and returns immediately
 
c'est bien la msdn quand meme  :)


Message édité par hellbilly le 21-11-2003 à 12:19:00
Reply

Marsh Posté le 21-11-2003 à 15:58:59    

mais pourtant meme si c'est C qui appelle la fonction destroy() cette fonction est dans B.  
 
Je pense que je n'ai pas ete assez precis dans mon explication.
 
En pseudo code:
 
//classe qui affiche la fenetre
class B:  
 
   methode pumpMessage(){
     //cette methode attend un message WM_QUIT pour sortir de sa boucle
   }    
 
   methode destroy(){
     DestroyWindow()
   }
}
     
//classe d'ou on veut commander la fermeture de la fenetre
// cree par B
class C :
 
  methode constructeur (instance de B)
    b=instance de B
 
  methode destroy()  
    fait b.destroy()
 
Donc meme si j'execute la methode destroy , je le fais depuis une instance de B. Donc le message WM_QUIT doit bien etre lancé au bon endroit.
 
Ou est la page ou t'as trouve ton info "A thread cannot use DestroyWindow to destroy a window created by a different thread" ?  
 
Avec mes precisions tu penses toujours que je ne peux pas faire comme je fais?

Reply

Marsh Posté le 21-11-2003 à 17:13:07    

Chriss a écrit :

mais pourtant meme si c'est C qui appelle la fonction destroy() cette fonction est dans B.  


C c'est un thread ? B une classe ?
C'est pas tres clair entre tes threads et tes classes A, B, C.
J'ai l'impression que tu mélanges...
 

Chriss a écrit :

En pseudo code:
 
//classe qui affiche la fenetre
class Window
{  
   methode pumpMessage(){
     //cette methode attend un message WM_QUIT pour sortir de sa boucle
   }    
 
   methode destroy(){
     DestroyWindow()
   }
}
     
//classe d'ou on veut commander la fermeture de la fenetre
// cree par B la classe ?
class DestroyWindow
{
  methode constructeur (instance de Window)
    win=instance de Window
 
  methode destroy()  
    fait win.destroy()
}
 
Donc meme si j'execute la methode destroy , je le fais depuis une instance de B. Donc le message WM_QUIT doit bien etre lancé au bon endroit.


L'important est de voir quel thread crée ta fenetre et quel thread veut la détruire. Si tu crées ta fenetre dans ton thread B et que tu appelles destroy() alors que c'est le thread C qui s'execute alors ca peut pas marcher.
 

Chriss a écrit :


Ou est la page ou t'as trouve ton info "A thread cannot use DestroyWindow to destroy a window created by a different thread" ?  


dans la msdn. Si tu ne l'a pas http://msdn.microsoft.com/default.aspx

Reply

Marsh Posté le 24-11-2003 à 09:51:56    

J'ai pas ete clair depuis le debut.
Donc plus simplement  
A et B sont un thread.  
B a comme fonction d'afficher une fenetre windows.
A veut fermer la fenetre affiché par B sachant que A a un lien sur B. A peut donc acceder a une instance de B.
Comment faire pour que A puisse fermer la fenetre ouverte par B?
 
 
 
 

Reply

Marsh Posté le 24-11-2003 à 09:59:35    

Chriss a écrit :

J'ai pas ete clair depuis le debut.
Donc plus simplement  
A et B sont un thread.  
B a comme fonction d'afficher une fenetre windows.
A veut fermer la fenetre affiché par B sachant que A a un lien sur B. A peut donc acceder a une instance de B.
Comment faire pour que A puisse fermer la fenetre ouverte par B?

En mettant une boîte-à-lettres entre A et B, A met un message signifiant "Tu vas la fermer ta fenêtre de daube sinon je t'éclate la tronche. Et n'oublie pas que tu me dois du fric au passage" dans la boite à lettre que B scrute régulièrement en attandant une lettre enflammée d'une admiratrice anonnyme.
B voyant un message aussi impératif va simplement femer la fenêtre dès que A le lui aura demandé.
 
Ainsi A parvient à fermer la fenêtre de B quand il le souhaite, sans casser le carreau. Ce qui serait un peu bête vu que justement, il veut que le trou dans le mur il soit fermé !


Message édité par nraynaud le 24-11-2003 à 10:01:18

---------------
trainoo.com, c'est fini
Reply

Sujets relatifs:

Leave a Replay

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