programmation windows -> fenetre et thread - C++ - Programmation
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
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?
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: |
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 : |
dans la msdn. Si tu ne l'a pas http://msdn.microsoft.com/default.aspx
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?
Marsh Posté le 24-11-2003 à 09:59:35
Chriss a écrit : J'ai pas ete clair depuis le debut. |
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é !
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