OVH Cloud OVH Cloud

Un evenement ne fonctionne pas normalement

4 réponses
Avatar
B#..
Bonjour,

J'ai fait un module d'acquisition video (windows form, DirectShowLib).
Une form avec les controles et un objet qui effectue l'acquisition et qui
analyse les frames.
Coté objet, j'ai créé un evenement déclenché par certaines frames a partir
d'un délégué avec une string comme parametre.
Coté Fenêtre, le gestionnaire d'évenement change le texte d'un label par la
string de l'évenement.
Mais voila : rien ne se passe...
Aucun plantage, aucun message,... lorsque je met un point d'arrêt, il passe
dans ma fonction ... (qui ne fait que "label1.text = texte" ) Mais mon label
reste désespérément vide ...
J'ai affecté à cet evenement une fonction qui écrit dans un fichier (via un
streamwriter) et là tout fonctionne..
Comment puis-je interragir avec les controles de la fenêtre ?

Merci d'avance,

B#

4 réponses

Avatar
Paul Bacelar
Le fait de changer le texte de label1, invalide la zone graphique du label1.

Mais l'affichage de la nouvelle valeur se fera pendant le rafraîchissement
de l'IHM.

Pour cela, il faut que le thread qui a créé le contrôle ait du temps libre,
et pas occupé dans une boucle de traitement par exemple.
--
Paul Bacelar
MVP VC++


"B#.." wrote in message
news:%
Bonjour,

J'ai fait un module d'acquisition video (windows form, DirectShowLib).
Une form avec les controles et un objet qui effectue l'acquisition et qui
analyse les frames.
Coté objet, j'ai créé un evenement déclenché par certaines frames a partir
d'un délégué avec une string comme parametre.
Coté Fenêtre, le gestionnaire d'évenement change le texte d'un label par
la string de l'évenement.
Mais voila : rien ne se passe...
Aucun plantage, aucun message,... lorsque je met un point d'arrêt, il
passe dans ma fonction ... (qui ne fait que "label1.text = texte" ) Mais
mon label reste désespérément vide ...
J'ai affecté à cet evenement une fonction qui écrit dans un fichier (via
un streamwriter) et là tout fonctionne..
Comment puis-je interragir avec les controles de la fenêtre ?

Merci d'avance,

B#



Avatar
Mehdi
On Sat, 14 Oct 2006 00:19:08 +0200, B#.. wrote:

J'ai fait un module d'acquisition video (windows form, DirectShowLib).
Une form avec les controles et un objet qui effectue l'acquisition et qui
analyse les frames.
Coté objet, j'ai créé un evenement déclenché par certaines frames a partir
d'un délégué avec une string comme parametre.
Coté Fenêtre, le gestionnaire d'évenement change le texte d'un label par la
string de l'évenement.
Mais voila : rien ne se passe...
Aucun plantage, aucun message,... lorsque je met un point d'arrêt, il passe
dans ma fonction ... (qui ne fait que "label1.text = texte" ) Mais mon label
reste désespérément vide ...
J'ai affecté à cet evenement une fonction qui écrit dans un fichier (via un
streamwriter) et là tout fonctionne..
Comment puis-je interragir avec les controles de la fenêtre ?



Un graphe DirectShow n'est rien de plus qu'une boucle infinie qui demande
des données au filtre source puis les fait passer de filtre en filtre
jusqu'a ce que les données arriver au filtre renderer auquel point le
graphe repart du filtre source pour récuperer de nouvelles données. Pour
éviter que cette boucle infinie ne bloque ton application, lorsque tu
démarre ton graphe, DirectShow crée automatiquement son propre thread et
cette boucle infinie est exécutée dans ce thread. Donc ton évenement qui
change le texte de ton label est exécuté dans le thread créé par
DirectShow. Tu ne peux pas acceder un controle tel qu'une Form, un boutton
ou un label depuis un thread autre que le thread de l'UI (thread ou tous
les controles ont été créés) sous peine de freeze, crash ou bugs bizarres
tel que celui que viens de rencontrer. Pour changer le texte de ton label,
il te faut d'abrod repasser dans le thread de l'UI. Tu peux faire cela en
uilisant les méthodes Control.Invoke ou Control.BeginInvoke. Il y a plein
d'examples d'utilisation sur le web.
Avatar
Delf
Il se trouve que Mehdi a formulé :

Pour changer le texte de ton label,
il te faut d'abrod repasser dans le thread de l'UI. Tu peux faire cela en
uilisant les méthodes Control.Invoke ou Control.BeginInvoke.



Question bête, on ne peut pas passer par une delegate ?
Merci.

--
Delf
Avatar
Mehdi
On Sat, 14 Oct 2006 22:08:12 +0200, Delf wrote:

Il se trouve que Mehdi a formulé :

Pour changer le texte de ton label,
il te faut d'abrod repasser dans le thread de l'UI. Tu peux faire cela en
uilisant les méthodes Control.Invoke ou Control.BeginInvoke.



Question bête, on ne peut pas passer par une delegate ?



Il te faudra passer un delegate a Control.Invoke ou BeginInvoke afin qu'il
soit executé dans le thread de l'UI. Simplement créer un delegate et
l'invoquer ne fonctionnera pas par contre car un delegate execute la
fonction vers laquelle il pointe dans le thread ou il est invoqué donc ca
ne résoudrai pas le probleme présent.