OVH Cloud OVH Cloud

fenetrage et threads: probleme pour fermer une fenetre lancé par un thread

2 réponses
Avatar
chriss
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++.

Je vous previens aussi que je n'ai aucune connaissance en programmation
windows et que je n'ai pas trouvé de reponse sur le web a ce probleme.

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

2 réponses

Avatar
Frederic Lachasse
"chriss" wrote in message
news:bpkmip$dbk$
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++.

Je vous previens aussi que je n'ai aucune connaissance en programmation
windows et que je n'ai pas trouvé de reponse sur le web a ce probleme.

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?



Dans la doc MSDN sur DestroyWindow(), il y a la remarque: Un thread ne peut
pas utiliser DestroyWindow() pour détruire une fenêtre créée par un autre
thread (...)

J'ai aussi essayé d'appeller la fonction PostQuitMessage(0) mais dans ce
cas il ne se passe rien.



PostQuitMessage fait le post du message WM_QUIT au thread courrant, pas aux
autres thread...

Merci par avance de vos nombreuses reponses!



Essaye:
PostMessage(hwnd, WM_QUIT, 0, 0);

En effet, PostMessage envoi toujours les messages au thread de la fenêtre,
même si la fonction est appelé depuis un autre thread.

Si tu connaît le thread ID, tu peux aussi utiliser PostThreadMessage().

--
Frédéric Lachasse -
Avatar
Vincent Burel
"Frederic Lachasse" wrote in message
news:84xvb.1350$
"chriss" wrote in message
news:bpkmip$dbk$
> 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++.
>
> Je vous previens aussi que je n'ai aucune connaissance en programmation
> windows et que je n'ai pas trouvé de reponse sur le web a ce probleme.
>
> 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?

Dans la doc MSDN sur DestroyWindow(), il y a la remarque: Un thread ne


peut
pas utiliser DestroyWindow() pour détruire une fenêtre créée par un autre
thread (...)

> J'ai aussi essayé d'appeller la fonction PostQuitMessage(0) mais dans ce
> cas il ne se passe rien.

PostQuitMessage fait le post du message WM_QUIT au thread courrant, pas


aux
autres thread...

> Merci par avance de vos nombreuses reponses!

Essaye:
PostMessage(hwnd, WM_QUIT, 0, 0);



vaut peut-être mieux faire un
PostMessage(hwnd, WM_CLOSE, 0, 0);

et laisser la fenêtre faire son PostQuitMessage, histoire qu'elle se ferme
correctement (éventuelles désallocations et destructions diverses)

Vincent Burel.