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

  FORUM HardWare.fr
  Programmation
  C++

  programmation windows -> fenetre et thread

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

programmation windows -> fenetre et thread

n°572192
chriss
Posté le 21-11-2003 à 10:04:18  profilanswer
 

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

mood
Publicité
Posté le 21-11-2003 à 10:04:18  profilanswer
 

n°572316
hellbilly
free smile
Posté le 21-11-2003 à 12:10:09  profilanswer
 

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
n°572701
chriss
Posté le 21-11-2003 à 15:58:59  profilanswer
 

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?

n°572744
hellbilly
free smile
Posté le 21-11-2003 à 17:13:07  profilanswer
 

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

n°574353
chriss
Posté le 24-11-2003 à 09:51:56  profilanswer
 

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?
 
 
 
 

n°574357
nraynaud
lol
Posté le 24-11-2003 à 09:59:35  profilanswer
 

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

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

  programmation windows -> fenetre et thread

 

Sujets relatifs
quelqu'un sait comment choisir les dimensions d'une nouvelle fenetre?Autopc clarion et windows CE
[MFC] Saisie de texte dans une fenêtre d'appli SDI[C++]Comment connaitre le répertoire d'installation de windows
[win32] fenêtre transparente ET clickabledimension d'un fenetre en pop up
multithread , sémaphore, linux : endormir un thread.portabilité windows/Linux du code
Lister les fichiers (nom...) d'un repertoire sous windows en C++Prog windows
Plus de sujets relatifs à : programmation windows -> fenetre et thread


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