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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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#
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#.." <bruno.remeyse@wanadoo.fr> wrote in message
news:%23Uw6xVx7GHA.2288@TK2MSFTNGP05.phx.gbl...
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 ?
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#
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.
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.
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.
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
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.
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
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.
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.
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.