1) Quand je fais un pDoc->UpdateAllViews(NULL) depuis
une de mes views, pas de problème. Par contre, si je l'appelle
depuis mon thread séparé, j'ai un "Debug Assertion Failed".
1) Quand je fais un pDoc->UpdateAllViews(NULL) depuis
une de mes views, pas de problème. Par contre, si je l'appelle
depuis mon thread séparé, j'ai un "Debug Assertion Failed".
1) Quand je fais un pDoc->UpdateAllViews(NULL) depuis
une de mes views, pas de problème. Par contre, si je l'appelle
depuis mon thread séparé, j'ai un "Debug Assertion Failed".
TigrouMeow wrote:1) Quand je fais un pDoc->UpdateAllViews(NULL) depuis
une de mes views, pas de problème. Par contre, si je l'appelle
depuis mon thread séparé, j'ai un "Debug Assertion Failed".
Bonjour,
Dans les MFC, les pointeurs vers une CWnd (ou une classe dérivée de CWnd)
ne peuvent pas être utilisés depuis n'importe quel thread. Ceci est dû au
fait que les tables qui associent un handle de fenêtre à un pointeur vers
une classe de type CWnd sont des données propres à un thread.
Reprise d'une de mes réponses sur le même sujet:
"
Je crois que vous êtes tombé dans un piège classique des MFC. On ne peut
pas utiliser dans un thread un pointeur vers une classe dérivée de CWnd si
l'instance de cette classe a été créée dans un autre thread. Cela est dû à
la manière dont les MFC stockent les maps qui font la correspondance entre
le handle de la fenêtre et le pointeur vers l'instance de la classe qui
représente la fenêtre. La plupart du temps, ces maps sont locales au
thread créateur. Ce qui veut dire en clair qu'un pointeur vers une class
CWnd ou dérivée instanciée dans un thread ne peut pas être passé à un
autre thread.<snip>
Ce qu'il faut faire c'est passer le handle de la fenêtre à l'autre thread,
recréer une instance de la classe locale au thread destinataire
(cette instanciation peut se faire grâce à la méthode
CWnd::FromHandlePermanent) et utiliser cette instance pour manipuler la
fenêtre. Il y a aura donc à ce moment, 2 instances de CWnd ou dérivée
pointant sur la même fenêtre, une dans chaque thread.
Quand vous n'avez plus besoin de l'instance de CWnd créée dans le thread
secondaire, utilisez Detach avant que l'objet ne soit détruit pour
éviter la destruction de la fenêtre.
"
Dans votre cas, des manipulations supplémentaires peuvent être
nécessaires.
TigrouMeow wrote:
1) Quand je fais un pDoc->UpdateAllViews(NULL) depuis
une de mes views, pas de problème. Par contre, si je l'appelle
depuis mon thread séparé, j'ai un "Debug Assertion Failed".
Bonjour,
Dans les MFC, les pointeurs vers une CWnd (ou une classe dérivée de CWnd)
ne peuvent pas être utilisés depuis n'importe quel thread. Ceci est dû au
fait que les tables qui associent un handle de fenêtre à un pointeur vers
une classe de type CWnd sont des données propres à un thread.
Reprise d'une de mes réponses sur le même sujet:
"
Je crois que vous êtes tombé dans un piège classique des MFC. On ne peut
pas utiliser dans un thread un pointeur vers une classe dérivée de CWnd si
l'instance de cette classe a été créée dans un autre thread. Cela est dû à
la manière dont les MFC stockent les maps qui font la correspondance entre
le handle de la fenêtre et le pointeur vers l'instance de la classe qui
représente la fenêtre. La plupart du temps, ces maps sont locales au
thread créateur. Ce qui veut dire en clair qu'un pointeur vers une class
CWnd ou dérivée instanciée dans un thread ne peut pas être passé à un
autre thread.<snip>
Ce qu'il faut faire c'est passer le handle de la fenêtre à l'autre thread,
recréer une instance de la classe locale au thread destinataire
(cette instanciation peut se faire grâce à la méthode
CWnd::FromHandlePermanent) et utiliser cette instance pour manipuler la
fenêtre. Il y a aura donc à ce moment, 2 instances de CWnd ou dérivée
pointant sur la même fenêtre, une dans chaque thread.
Quand vous n'avez plus besoin de l'instance de CWnd créée dans le thread
secondaire, utilisez Detach avant que l'objet ne soit détruit pour
éviter la destruction de la fenêtre.
"
Dans votre cas, des manipulations supplémentaires peuvent être
nécessaires.
TigrouMeow wrote:1) Quand je fais un pDoc->UpdateAllViews(NULL) depuis
une de mes views, pas de problème. Par contre, si je l'appelle
depuis mon thread séparé, j'ai un "Debug Assertion Failed".
Bonjour,
Dans les MFC, les pointeurs vers une CWnd (ou une classe dérivée de CWnd)
ne peuvent pas être utilisés depuis n'importe quel thread. Ceci est dû au
fait que les tables qui associent un handle de fenêtre à un pointeur vers
une classe de type CWnd sont des données propres à un thread.
Reprise d'une de mes réponses sur le même sujet:
"
Je crois que vous êtes tombé dans un piège classique des MFC. On ne peut
pas utiliser dans un thread un pointeur vers une classe dérivée de CWnd si
l'instance de cette classe a été créée dans un autre thread. Cela est dû à
la manière dont les MFC stockent les maps qui font la correspondance entre
le handle de la fenêtre et le pointeur vers l'instance de la classe qui
représente la fenêtre. La plupart du temps, ces maps sont locales au
thread créateur. Ce qui veut dire en clair qu'un pointeur vers une class
CWnd ou dérivée instanciée dans un thread ne peut pas être passé à un
autre thread.<snip>
Ce qu'il faut faire c'est passer le handle de la fenêtre à l'autre thread,
recréer une instance de la classe locale au thread destinataire
(cette instanciation peut se faire grâce à la méthode
CWnd::FromHandlePermanent) et utiliser cette instance pour manipuler la
fenêtre. Il y a aura donc à ce moment, 2 instances de CWnd ou dérivée
pointant sur la même fenêtre, une dans chaque thread.
Quand vous n'avez plus besoin de l'instance de CWnd créée dans le thread
secondaire, utilisez Detach avant que l'objet ne soit détruit pour
éviter la destruction de la fenêtre.
"
Dans votre cas, des manipulations supplémentaires peuvent être
nécessaires.
"Patrick Philippot" a écrit dans le
message de news: d35arb$2isr$TigrouMeow wrote:1) Quand je fais un pDoc->UpdateAllViews(NULL) depuis
une de mes views, pas de problème. Par contre, si je l'appelle
depuis mon thread séparé, j'ai un "Debug Assertion Failed".
Bonjour,
Dans les MFC, les pointeurs vers une CWnd (ou une classe dérivée de CWnd)
ne peuvent pas être utilisés depuis n'importe quel thread. Ceci est dû au
fait que les tables qui associent un handle de fenêtre à un pointeur vers
une classe de type CWnd sont des données propres à un thread.
Reprise d'une de mes réponses sur le même sujet:
"
Je crois que vous êtes tombé dans un piège classique des MFC. On ne peut
pas utiliser dans un thread un pointeur vers une classe dérivée de CWnd
si l'instance de cette classe a été créée dans un autre thread. Cela est
dû à la manière dont les MFC stockent les maps qui font la correspondance
entre le handle de la fenêtre et le pointeur vers l'instance de la classe
qui représente la fenêtre. La plupart du temps, ces maps sont locales au
thread créateur. Ce qui veut dire en clair qu'un pointeur vers une class
CWnd ou dérivée instanciée dans un thread ne peut pas être passé à un
autre thread.<snip>
Ce qu'il faut faire c'est passer le handle de la fenêtre à l'autre
thread, recréer une instance de la classe locale au thread destinataire
(cette instanciation peut se faire grâce à la méthode
CWnd::FromHandlePermanent) et utiliser cette instance pour manipuler la
fenêtre. Il y a aura donc à ce moment, 2 instances de CWnd ou dérivée
pointant sur la même fenêtre, une dans chaque thread.
Quand vous n'avez plus besoin de l'instance de CWnd créée dans le thread
secondaire, utilisez Detach avant que l'objet ne soit détruit pour
éviter la destruction de la fenêtre.
"
Dans votre cas, des manipulations supplémentaires peuvent être
nécessaires.
Merci :) Je pense à peu près avoir compris, là j'essaye de l'implémenter
mais c'est pas encore gagné...
Par contre, si je veux utiliser mon document depuis mon thread séparé,
je fais comment ? Car j'aimerais bien pouvoir faire des UpdateAllViews
à partir de lui, et vu que c'est lui qui contient toutes mes données...
J'ai regardé mais les docs n'ont pas de FromHandlePermanent ou
d'équivalent...
"Patrick Philippot" <patrick.philippot@mainsoft.xx.fr> a écrit dans le
message de news: d35arb$2isr$1@biggoron.nerim.net...
TigrouMeow wrote:
1) Quand je fais un pDoc->UpdateAllViews(NULL) depuis
une de mes views, pas de problème. Par contre, si je l'appelle
depuis mon thread séparé, j'ai un "Debug Assertion Failed".
Bonjour,
Dans les MFC, les pointeurs vers une CWnd (ou une classe dérivée de CWnd)
ne peuvent pas être utilisés depuis n'importe quel thread. Ceci est dû au
fait que les tables qui associent un handle de fenêtre à un pointeur vers
une classe de type CWnd sont des données propres à un thread.
Reprise d'une de mes réponses sur le même sujet:
"
Je crois que vous êtes tombé dans un piège classique des MFC. On ne peut
pas utiliser dans un thread un pointeur vers une classe dérivée de CWnd
si l'instance de cette classe a été créée dans un autre thread. Cela est
dû à la manière dont les MFC stockent les maps qui font la correspondance
entre le handle de la fenêtre et le pointeur vers l'instance de la classe
qui représente la fenêtre. La plupart du temps, ces maps sont locales au
thread créateur. Ce qui veut dire en clair qu'un pointeur vers une class
CWnd ou dérivée instanciée dans un thread ne peut pas être passé à un
autre thread.<snip>
Ce qu'il faut faire c'est passer le handle de la fenêtre à l'autre
thread, recréer une instance de la classe locale au thread destinataire
(cette instanciation peut se faire grâce à la méthode
CWnd::FromHandlePermanent) et utiliser cette instance pour manipuler la
fenêtre. Il y a aura donc à ce moment, 2 instances de CWnd ou dérivée
pointant sur la même fenêtre, une dans chaque thread.
Quand vous n'avez plus besoin de l'instance de CWnd créée dans le thread
secondaire, utilisez Detach avant que l'objet ne soit détruit pour
éviter la destruction de la fenêtre.
"
Dans votre cas, des manipulations supplémentaires peuvent être
nécessaires.
Merci :) Je pense à peu près avoir compris, là j'essaye de l'implémenter
mais c'est pas encore gagné...
Par contre, si je veux utiliser mon document depuis mon thread séparé,
je fais comment ? Car j'aimerais bien pouvoir faire des UpdateAllViews
à partir de lui, et vu que c'est lui qui contient toutes mes données...
J'ai regardé mais les docs n'ont pas de FromHandlePermanent ou
d'équivalent...
"Patrick Philippot" a écrit dans le
message de news: d35arb$2isr$TigrouMeow wrote:1) Quand je fais un pDoc->UpdateAllViews(NULL) depuis
une de mes views, pas de problème. Par contre, si je l'appelle
depuis mon thread séparé, j'ai un "Debug Assertion Failed".
Bonjour,
Dans les MFC, les pointeurs vers une CWnd (ou une classe dérivée de CWnd)
ne peuvent pas être utilisés depuis n'importe quel thread. Ceci est dû au
fait que les tables qui associent un handle de fenêtre à un pointeur vers
une classe de type CWnd sont des données propres à un thread.
Reprise d'une de mes réponses sur le même sujet:
"
Je crois que vous êtes tombé dans un piège classique des MFC. On ne peut
pas utiliser dans un thread un pointeur vers une classe dérivée de CWnd
si l'instance de cette classe a été créée dans un autre thread. Cela est
dû à la manière dont les MFC stockent les maps qui font la correspondance
entre le handle de la fenêtre et le pointeur vers l'instance de la classe
qui représente la fenêtre. La plupart du temps, ces maps sont locales au
thread créateur. Ce qui veut dire en clair qu'un pointeur vers une class
CWnd ou dérivée instanciée dans un thread ne peut pas être passé à un
autre thread.<snip>
Ce qu'il faut faire c'est passer le handle de la fenêtre à l'autre
thread, recréer une instance de la classe locale au thread destinataire
(cette instanciation peut se faire grâce à la méthode
CWnd::FromHandlePermanent) et utiliser cette instance pour manipuler la
fenêtre. Il y a aura donc à ce moment, 2 instances de CWnd ou dérivée
pointant sur la même fenêtre, une dans chaque thread.
Quand vous n'avez plus besoin de l'instance de CWnd créée dans le thread
secondaire, utilisez Detach avant que l'objet ne soit détruit pour
éviter la destruction de la fenêtre.
"
Dans votre cas, des manipulations supplémentaires peuvent être
nécessaires.
Merci :) Je pense à peu près avoir compris, là j'essaye de l'implémenter
mais c'est pas encore gagné...
Par contre, si je veux utiliser mon document depuis mon thread séparé,
je fais comment ? Car j'aimerais bien pouvoir faire des UpdateAllViews
à partir de lui, et vu que c'est lui qui contient toutes mes données...
J'ai regardé mais les docs n'ont pas de FromHandlePermanent ou
d'équivalent...
> En fait, pour simplifier, j'ai mon Doc et des views associés.
J'ai un thread à part qui tourne et qui récupère des infos sur le
système (en gros). Quand il a des infos, il met à jour des variables
du Doc, et il fait appel à un UpdateAllViews.
Voilà c'est tout ce que je veux faire :)
> En fait, pour simplifier, j'ai mon Doc et des views associés.
J'ai un thread à part qui tourne et qui récupère des infos sur le
système (en gros). Quand il a des infos, il met à jour des variables
du Doc, et il fait appel à un UpdateAllViews.
Voilà c'est tout ce que je veux faire :)
> En fait, pour simplifier, j'ai mon Doc et des views associés.
J'ai un thread à part qui tourne et qui récupère des infos sur le
système (en gros). Quand il a des infos, il met à jour des variables
du Doc, et il fait appel à un UpdateAllViews.
Voilà c'est tout ce que je veux faire :)
En fait, pour simplifier, j'ai mon Doc et des views associés.
J'ai un thread à part qui tourne et qui récupère des infos sur le
système (en gros). Quand il a des infos, il met à jour des variables
du Doc, et il fait appel à un UpdateAllViews.
Voilà c'est tout ce que je veux faire :)
Il y a plus d'infos sur ce problème en général sur cette page:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_Multithreading.3a_.Programming_Tips.asp
La solution qui me paraît évidente, c'est tout simplement d'envoyer
(poster) depuis le thread un message privé à la fenêtre principale (en
passant éventuellement en paramètre le pointeur sur le document). Sur
réception du message, UpdateAllViews est appelé sur le document passé en
paramètre.
En fait, pour simplifier, j'ai mon Doc et des views associés.
J'ai un thread à part qui tourne et qui récupère des infos sur le
système (en gros). Quand il a des infos, il met à jour des variables
du Doc, et il fait appel à un UpdateAllViews.
Voilà c'est tout ce que je veux faire :)
Il y a plus d'infos sur ce problème en général sur cette page:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_Multithreading.3a_.Programming_Tips.asp
La solution qui me paraît évidente, c'est tout simplement d'envoyer
(poster) depuis le thread un message privé à la fenêtre principale (en
passant éventuellement en paramètre le pointeur sur le document). Sur
réception du message, UpdateAllViews est appelé sur le document passé en
paramètre.
En fait, pour simplifier, j'ai mon Doc et des views associés.
J'ai un thread à part qui tourne et qui récupère des infos sur le
système (en gros). Quand il a des infos, il met à jour des variables
du Doc, et il fait appel à un UpdateAllViews.
Voilà c'est tout ce que je veux faire :)
Il y a plus d'infos sur ce problème en général sur cette page:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_Multithreading.3a_.Programming_Tips.asp
La solution qui me paraît évidente, c'est tout simplement d'envoyer
(poster) depuis le thread un message privé à la fenêtre principale (en
passant éventuellement en paramètre le pointeur sur le document). Sur
réception du message, UpdateAllViews est appelé sur le document passé en
paramètre.
La solution qui me paraît évidente, c'est tout simplement d'envoyer
(poster) depuis le thread un message privé à la fenêtre principale
(en passant éventuellement en paramètre le pointeur sur le
document). Sur réception du message, UpdateAllViews est appelé sur
le document passé en paramètre.
En fait j'ai surement un manque de connaissance MFC à côté.
C'est à propos de cette "fenêtre principale". Quelle est-elle ? Est-ce
ma MainFrame ?
Si c'est la MainFrame, il n'est pas possible de faire des
UpdateAllViews... et je ne sais pas du tout comment
accéder au doc non plus depuis celle-ci...
La solution qui me paraît évidente, c'est tout simplement d'envoyer
(poster) depuis le thread un message privé à la fenêtre principale
(en passant éventuellement en paramètre le pointeur sur le
document). Sur réception du message, UpdateAllViews est appelé sur
le document passé en paramètre.
En fait j'ai surement un manque de connaissance MFC à côté.
C'est à propos de cette "fenêtre principale". Quelle est-elle ? Est-ce
ma MainFrame ?
Si c'est la MainFrame, il n'est pas possible de faire des
UpdateAllViews... et je ne sais pas du tout comment
accéder au doc non plus depuis celle-ci...
La solution qui me paraît évidente, c'est tout simplement d'envoyer
(poster) depuis le thread un message privé à la fenêtre principale
(en passant éventuellement en paramètre le pointeur sur le
document). Sur réception du message, UpdateAllViews est appelé sur
le document passé en paramètre.
En fait j'ai surement un manque de connaissance MFC à côté.
C'est à propos de cette "fenêtre principale". Quelle est-elle ? Est-ce
ma MainFrame ?
Si c'est la MainFrame, il n'est pas possible de faire des
UpdateAllViews... et je ne sais pas du tout comment
accéder au doc non plus depuis celle-ci...
TigrouMeow wrote:La solution qui me paraît évidente, c'est tout simplement d'envoyer
(poster) depuis le thread un message privé à la fenêtre principale
(en passant éventuellement en paramètre le pointeur sur le
document). Sur réception du message, UpdateAllViews est appelé sur
le document passé en paramètre.
En fait j'ai surement un manque de connaissance MFC à côté.
Il me semble en effet, sauf votre respect, qu'avant de vous lancer dans
des opérations de multithreading toujours délicates sous les MFC, il vous
faudrait "asseoir" quelque peu votre connaissance de cette bibliothèque
:-) . Comme je l'ai expliqué plus haut, le multithreading sous les MFC
demande une connaissance de certains phénomènes parasites qu'il faut
maîtriser pour éviter les problèmes (notamment le fonctionnement des
messages maps et la manière dont sont gérées les associations handle de
fenêtre / pointeur vers la classe correspondante). La lecture d'un bon
bouqin sur les MFC comme le Blaszczak (Professional MFC with Visual C++ ),
le Prosise ou MFC Internals de Shepherd et Wingo vous sera utile (voire
indispensable).
Je sais que c'est idiot mais "commencer par le commencement" peut parfois
(que dis-je, tout le temps) faire gagner énormément de temps.C'est à propos de cette "fenêtre principale". Quelle est-elle ? Est-ce
ma MainFrame ?
Je ne connais pas l'appli mais oui, a priori.Si c'est la MainFrame, il n'est pas possible de faire des
UpdateAllViews... et je ne sais pas du tout comment
accéder au doc non plus depuis celle-ci...
Si vous ne maîtrisez pas cette architecture et si vous ne savez pas
comment lister les documents existants depuis la mainframe, le mieux est
peut-être d'envoyer un message de commande (au lieu d'un message privé) et
de traiter ce message au niveau du/des document(s). Par exemple:
#define MACOMMANDE_UPDATE nnnnn // A vous de décider d'une valeur
unique pour la commande
Dans le thread, on suppose que vous avez récupéré le pointeur vers la
mainframe avec AfxGetMainWnd à un moment donné et stocké cette valeur dans
une variable de classe (par exemple m_pMainWnd):
m_pMainWnd->PostMessage(WM_COMMAND, MAKEWPARAM((MACOMMANDE_UPDATE , 0),
0);
Dans la classe document, déclarez :
void OnDoUpdateAll();
Dans la message map, de la classe document, ajoutez:
ON_COMMAND(MACOMMANDE_UPDATE, OnDoUpdateAll)
Dans l'implémentation de OnDoUpdateAll, faites l'appel à UpdateAllViews.
TigrouMeow wrote:
La solution qui me paraît évidente, c'est tout simplement d'envoyer
(poster) depuis le thread un message privé à la fenêtre principale
(en passant éventuellement en paramètre le pointeur sur le
document). Sur réception du message, UpdateAllViews est appelé sur
le document passé en paramètre.
En fait j'ai surement un manque de connaissance MFC à côté.
Il me semble en effet, sauf votre respect, qu'avant de vous lancer dans
des opérations de multithreading toujours délicates sous les MFC, il vous
faudrait "asseoir" quelque peu votre connaissance de cette bibliothèque
:-) . Comme je l'ai expliqué plus haut, le multithreading sous les MFC
demande une connaissance de certains phénomènes parasites qu'il faut
maîtriser pour éviter les problèmes (notamment le fonctionnement des
messages maps et la manière dont sont gérées les associations handle de
fenêtre / pointeur vers la classe correspondante). La lecture d'un bon
bouqin sur les MFC comme le Blaszczak (Professional MFC with Visual C++ ),
le Prosise ou MFC Internals de Shepherd et Wingo vous sera utile (voire
indispensable).
Je sais que c'est idiot mais "commencer par le commencement" peut parfois
(que dis-je, tout le temps) faire gagner énormément de temps.
C'est à propos de cette "fenêtre principale". Quelle est-elle ? Est-ce
ma MainFrame ?
Je ne connais pas l'appli mais oui, a priori.
Si c'est la MainFrame, il n'est pas possible de faire des
UpdateAllViews... et je ne sais pas du tout comment
accéder au doc non plus depuis celle-ci...
Si vous ne maîtrisez pas cette architecture et si vous ne savez pas
comment lister les documents existants depuis la mainframe, le mieux est
peut-être d'envoyer un message de commande (au lieu d'un message privé) et
de traiter ce message au niveau du/des document(s). Par exemple:
#define MACOMMANDE_UPDATE nnnnn // A vous de décider d'une valeur
unique pour la commande
Dans le thread, on suppose que vous avez récupéré le pointeur vers la
mainframe avec AfxGetMainWnd à un moment donné et stocké cette valeur dans
une variable de classe (par exemple m_pMainWnd):
m_pMainWnd->PostMessage(WM_COMMAND, MAKEWPARAM((MACOMMANDE_UPDATE , 0),
0);
Dans la classe document, déclarez :
void OnDoUpdateAll();
Dans la message map, de la classe document, ajoutez:
ON_COMMAND(MACOMMANDE_UPDATE, OnDoUpdateAll)
Dans l'implémentation de OnDoUpdateAll, faites l'appel à UpdateAllViews.
TigrouMeow wrote:La solution qui me paraît évidente, c'est tout simplement d'envoyer
(poster) depuis le thread un message privé à la fenêtre principale
(en passant éventuellement en paramètre le pointeur sur le
document). Sur réception du message, UpdateAllViews est appelé sur
le document passé en paramètre.
En fait j'ai surement un manque de connaissance MFC à côté.
Il me semble en effet, sauf votre respect, qu'avant de vous lancer dans
des opérations de multithreading toujours délicates sous les MFC, il vous
faudrait "asseoir" quelque peu votre connaissance de cette bibliothèque
:-) . Comme je l'ai expliqué plus haut, le multithreading sous les MFC
demande une connaissance de certains phénomènes parasites qu'il faut
maîtriser pour éviter les problèmes (notamment le fonctionnement des
messages maps et la manière dont sont gérées les associations handle de
fenêtre / pointeur vers la classe correspondante). La lecture d'un bon
bouqin sur les MFC comme le Blaszczak (Professional MFC with Visual C++ ),
le Prosise ou MFC Internals de Shepherd et Wingo vous sera utile (voire
indispensable).
Je sais que c'est idiot mais "commencer par le commencement" peut parfois
(que dis-je, tout le temps) faire gagner énormément de temps.C'est à propos de cette "fenêtre principale". Quelle est-elle ? Est-ce
ma MainFrame ?
Je ne connais pas l'appli mais oui, a priori.Si c'est la MainFrame, il n'est pas possible de faire des
UpdateAllViews... et je ne sais pas du tout comment
accéder au doc non plus depuis celle-ci...
Si vous ne maîtrisez pas cette architecture et si vous ne savez pas
comment lister les documents existants depuis la mainframe, le mieux est
peut-être d'envoyer un message de commande (au lieu d'un message privé) et
de traiter ce message au niveau du/des document(s). Par exemple:
#define MACOMMANDE_UPDATE nnnnn // A vous de décider d'une valeur
unique pour la commande
Dans le thread, on suppose que vous avez récupéré le pointeur vers la
mainframe avec AfxGetMainWnd à un moment donné et stocké cette valeur dans
une variable de classe (par exemple m_pMainWnd):
m_pMainWnd->PostMessage(WM_COMMAND, MAKEWPARAM((MACOMMANDE_UPDATE , 0),
0);
Dans la classe document, déclarez :
void OnDoUpdateAll();
Dans la message map, de la classe document, ajoutez:
ON_COMMAND(MACOMMANDE_UPDATE, OnDoUpdateAll)
Dans l'implémentation de OnDoUpdateAll, faites l'appel à UpdateAllViews.
"Patrick Philippot" a écrit dans le
message de news: d384e3$l3h$TigrouMeow wrote:La solution qui me paraît évidente, c'est tout simplement d'envoyer
(poster) depuis le thread un message privé à la fenêtre principale
(en passant éventuellement en paramètre le pointeur sur le
document). Sur réception du message, UpdateAllViews est appelé sur
le document passé en paramètre.
En fait j'ai surement un manque de connaissance MFC à côté.
Il me semble en effet, sauf votre respect, qu'avant de vous lancer dans
des opérations de multithreading toujours délicates sous les MFC, il vous
faudrait "asseoir" quelque peu votre connaissance de cette bibliothèque
:-) . Comme je l'ai expliqué plus haut, le multithreading sous les MFC
demande une connaissance de certains phénomènes parasites qu'il faut
maîtriser pour éviter les problèmes (notamment le fonctionnement des
messages maps et la manière dont sont gérées les associations handle de
fenêtre / pointeur vers la classe correspondante). La lecture d'un bon
bouqin sur les MFC comme le Blaszczak (Professional MFC with Visual
C++ ), le Prosise ou MFC Internals de Shepherd et Wingo vous sera utile
(voire indispensable).
Je sais que c'est idiot mais "commencer par le commencement" peut parfois
(que dis-je, tout le temps) faire gagner énormément de temps.C'est à propos de cette "fenêtre principale". Quelle est-elle ? Est-ce
ma MainFrame ?
Je ne connais pas l'appli mais oui, a priori.Si c'est la MainFrame, il n'est pas possible de faire des
UpdateAllViews... et je ne sais pas du tout comment
accéder au doc non plus depuis celle-ci...
Si vous ne maîtrisez pas cette architecture et si vous ne savez pas
comment lister les documents existants depuis la mainframe, le mieux est
peut-être d'envoyer un message de commande (au lieu d'un message privé)
et de traiter ce message au niveau du/des document(s). Par exemple:
#define MACOMMANDE_UPDATE nnnnn // A vous de décider d'une valeur
unique pour la commande
Dans le thread, on suppose que vous avez récupéré le pointeur vers la
mainframe avec AfxGetMainWnd à un moment donné et stocké cette valeur
dans une variable de classe (par exemple m_pMainWnd):
m_pMainWnd->PostMessage(WM_COMMAND, MAKEWPARAM((MACOMMANDE_UPDATE , 0),
0);
Dans la classe document, déclarez :
void OnDoUpdateAll();
Dans la message map, de la classe document, ajoutez:
ON_COMMAND(MACOMMANDE_UPDATE, OnDoUpdateAll)
Dans l'implémentation de OnDoUpdateAll, faites l'appel à UpdateAllViews.
Tout d'abord merci beaucoup pour votre aide :)
Mais décidément, j'arrête pas d'avoir des problèmes et rien ne marche,
j'ai pourtant lu attentivement tout ce que vous avez écrit, et la MSDN
et j'ai cherché partout sur Google...
J'ai essayé d'implémenté comme vous me l'avez dit, donc dans mon doc
je trouve un :
BEGIN_MESSAGE_MAP(CWinTraceDoc, CDocument)
ON_COMMAND(LIBRARY_ADD, AddLibrary)
END_MESSAGE_MAP()
Et la déclaration de la fonction :
void CWinTraceDoc::AddLibrairy()
{
TRACE("AddLibraryn");
}
Et dans l'include du Doc je déclare le prototype comme ça :
afx_msg void AddLibrairy();
Il me sort une erreur :
AddLibrary : identificateur non déclaré.
Je comprend vraiment plus rien là :(
Suis désolé d'être aussi nul, mais j'ai de plus en plus l'impression
que la MFC est très très mal faite de partout, vu que j'ai jamais
eu de problèmes aussi étonnant avec les WinForms ni Gtk...
"Patrick Philippot" <patrick.philippot@mainsoft.xx.fr> a écrit dans le
message de news: d384e3$l3h$1@biggoron.nerim.net...
TigrouMeow wrote:
La solution qui me paraît évidente, c'est tout simplement d'envoyer
(poster) depuis le thread un message privé à la fenêtre principale
(en passant éventuellement en paramètre le pointeur sur le
document). Sur réception du message, UpdateAllViews est appelé sur
le document passé en paramètre.
En fait j'ai surement un manque de connaissance MFC à côté.
Il me semble en effet, sauf votre respect, qu'avant de vous lancer dans
des opérations de multithreading toujours délicates sous les MFC, il vous
faudrait "asseoir" quelque peu votre connaissance de cette bibliothèque
:-) . Comme je l'ai expliqué plus haut, le multithreading sous les MFC
demande une connaissance de certains phénomènes parasites qu'il faut
maîtriser pour éviter les problèmes (notamment le fonctionnement des
messages maps et la manière dont sont gérées les associations handle de
fenêtre / pointeur vers la classe correspondante). La lecture d'un bon
bouqin sur les MFC comme le Blaszczak (Professional MFC with Visual
C++ ), le Prosise ou MFC Internals de Shepherd et Wingo vous sera utile
(voire indispensable).
Je sais que c'est idiot mais "commencer par le commencement" peut parfois
(que dis-je, tout le temps) faire gagner énormément de temps.
C'est à propos de cette "fenêtre principale". Quelle est-elle ? Est-ce
ma MainFrame ?
Je ne connais pas l'appli mais oui, a priori.
Si c'est la MainFrame, il n'est pas possible de faire des
UpdateAllViews... et je ne sais pas du tout comment
accéder au doc non plus depuis celle-ci...
Si vous ne maîtrisez pas cette architecture et si vous ne savez pas
comment lister les documents existants depuis la mainframe, le mieux est
peut-être d'envoyer un message de commande (au lieu d'un message privé)
et de traiter ce message au niveau du/des document(s). Par exemple:
#define MACOMMANDE_UPDATE nnnnn // A vous de décider d'une valeur
unique pour la commande
Dans le thread, on suppose que vous avez récupéré le pointeur vers la
mainframe avec AfxGetMainWnd à un moment donné et stocké cette valeur
dans une variable de classe (par exemple m_pMainWnd):
m_pMainWnd->PostMessage(WM_COMMAND, MAKEWPARAM((MACOMMANDE_UPDATE , 0),
0);
Dans la classe document, déclarez :
void OnDoUpdateAll();
Dans la message map, de la classe document, ajoutez:
ON_COMMAND(MACOMMANDE_UPDATE, OnDoUpdateAll)
Dans l'implémentation de OnDoUpdateAll, faites l'appel à UpdateAllViews.
Tout d'abord merci beaucoup pour votre aide :)
Mais décidément, j'arrête pas d'avoir des problèmes et rien ne marche,
j'ai pourtant lu attentivement tout ce que vous avez écrit, et la MSDN
et j'ai cherché partout sur Google...
J'ai essayé d'implémenté comme vous me l'avez dit, donc dans mon doc
je trouve un :
BEGIN_MESSAGE_MAP(CWinTraceDoc, CDocument)
ON_COMMAND(LIBRARY_ADD, AddLibrary)
END_MESSAGE_MAP()
Et la déclaration de la fonction :
void CWinTraceDoc::AddLibrairy()
{
TRACE("AddLibraryn");
}
Et dans l'include du Doc je déclare le prototype comme ça :
afx_msg void AddLibrairy();
Il me sort une erreur :
AddLibrary : identificateur non déclaré.
Je comprend vraiment plus rien là :(
Suis désolé d'être aussi nul, mais j'ai de plus en plus l'impression
que la MFC est très très mal faite de partout, vu que j'ai jamais
eu de problèmes aussi étonnant avec les WinForms ni Gtk...
"Patrick Philippot" a écrit dans le
message de news: d384e3$l3h$TigrouMeow wrote:La solution qui me paraît évidente, c'est tout simplement d'envoyer
(poster) depuis le thread un message privé à la fenêtre principale
(en passant éventuellement en paramètre le pointeur sur le
document). Sur réception du message, UpdateAllViews est appelé sur
le document passé en paramètre.
En fait j'ai surement un manque de connaissance MFC à côté.
Il me semble en effet, sauf votre respect, qu'avant de vous lancer dans
des opérations de multithreading toujours délicates sous les MFC, il vous
faudrait "asseoir" quelque peu votre connaissance de cette bibliothèque
:-) . Comme je l'ai expliqué plus haut, le multithreading sous les MFC
demande une connaissance de certains phénomènes parasites qu'il faut
maîtriser pour éviter les problèmes (notamment le fonctionnement des
messages maps et la manière dont sont gérées les associations handle de
fenêtre / pointeur vers la classe correspondante). La lecture d'un bon
bouqin sur les MFC comme le Blaszczak (Professional MFC with Visual
C++ ), le Prosise ou MFC Internals de Shepherd et Wingo vous sera utile
(voire indispensable).
Je sais que c'est idiot mais "commencer par le commencement" peut parfois
(que dis-je, tout le temps) faire gagner énormément de temps.C'est à propos de cette "fenêtre principale". Quelle est-elle ? Est-ce
ma MainFrame ?
Je ne connais pas l'appli mais oui, a priori.Si c'est la MainFrame, il n'est pas possible de faire des
UpdateAllViews... et je ne sais pas du tout comment
accéder au doc non plus depuis celle-ci...
Si vous ne maîtrisez pas cette architecture et si vous ne savez pas
comment lister les documents existants depuis la mainframe, le mieux est
peut-être d'envoyer un message de commande (au lieu d'un message privé)
et de traiter ce message au niveau du/des document(s). Par exemple:
#define MACOMMANDE_UPDATE nnnnn // A vous de décider d'une valeur
unique pour la commande
Dans le thread, on suppose que vous avez récupéré le pointeur vers la
mainframe avec AfxGetMainWnd à un moment donné et stocké cette valeur
dans une variable de classe (par exemple m_pMainWnd):
m_pMainWnd->PostMessage(WM_COMMAND, MAKEWPARAM((MACOMMANDE_UPDATE , 0),
0);
Dans la classe document, déclarez :
void OnDoUpdateAll();
Dans la message map, de la classe document, ajoutez:
ON_COMMAND(MACOMMANDE_UPDATE, OnDoUpdateAll)
Dans l'implémentation de OnDoUpdateAll, faites l'appel à UpdateAllViews.
Tout d'abord merci beaucoup pour votre aide :)
Mais décidément, j'arrête pas d'avoir des problèmes et rien ne marche,
j'ai pourtant lu attentivement tout ce que vous avez écrit, et la MSDN
et j'ai cherché partout sur Google...
J'ai essayé d'implémenté comme vous me l'avez dit, donc dans mon doc
je trouve un :
BEGIN_MESSAGE_MAP(CWinTraceDoc, CDocument)
ON_COMMAND(LIBRARY_ADD, AddLibrary)
END_MESSAGE_MAP()
Et la déclaration de la fonction :
void CWinTraceDoc::AddLibrairy()
{
TRACE("AddLibraryn");
}
Et dans l'include du Doc je déclare le prototype comme ça :
afx_msg void AddLibrairy();
Il me sort une erreur :
AddLibrary : identificateur non déclaré.
Je comprend vraiment plus rien là :(
Suis désolé d'être aussi nul, mais j'ai de plus en plus l'impression
que la MFC est très très mal faite de partout, vu que j'ai jamais
eu de problèmes aussi étonnant avec les WinForms ni Gtk...
J'ai essayé d'implémenté comme vous me l'avez dit, donc dans mon doc
je trouve un :
BEGIN_MESSAGE_MAP(CWinTraceDoc, CDocument)
ON_COMMAND(LIBRARY_ADD, AddLibrary)
END_MESSAGE_MAP()
Et la déclaration de la fonction :
void CWinTraceDoc::AddLibrairy()
{
TRACE("AddLibraryn");
}
Et dans l'include du Doc je déclare le prototype comme ça :
afx_msg void AddLibrairy();
Il me sort une erreur :
AddLibrary : identificateur non déclaré.
Suis désolé d'être aussi nul,
mais j'ai de plus en plus l'impression
que la MFC est très très mal faite de partout,
J'ai essayé d'implémenté comme vous me l'avez dit, donc dans mon doc
je trouve un :
BEGIN_MESSAGE_MAP(CWinTraceDoc, CDocument)
ON_COMMAND(LIBRARY_ADD, AddLibrary)
END_MESSAGE_MAP()
Et la déclaration de la fonction :
void CWinTraceDoc::AddLibrairy()
{
TRACE("AddLibraryn");
}
Et dans l'include du Doc je déclare le prototype comme ça :
afx_msg void AddLibrairy();
Il me sort une erreur :
AddLibrary : identificateur non déclaré.
Suis désolé d'être aussi nul,
mais j'ai de plus en plus l'impression
que la MFC est très très mal faite de partout,
J'ai essayé d'implémenté comme vous me l'avez dit, donc dans mon doc
je trouve un :
BEGIN_MESSAGE_MAP(CWinTraceDoc, CDocument)
ON_COMMAND(LIBRARY_ADD, AddLibrary)
END_MESSAGE_MAP()
Et la déclaration de la fonction :
void CWinTraceDoc::AddLibrairy()
{
TRACE("AddLibraryn");
}
Et dans l'include du Doc je déclare le prototype comme ça :
afx_msg void AddLibrairy();
Il me sort une erreur :
AddLibrary : identificateur non déclaré.
Suis désolé d'être aussi nul,
mais j'ai de plus en plus l'impression
que la MFC est très très mal faite de partout,
J'y comprends rieeeeeeeeeeeeen, merci une fois de plus de m'aider...
J'y comprends rieeeeeeeeeeeeen, merci une fois de plus de m'aider...
J'y comprends rieeeeeeeeeeeeen, merci une fois de plus de m'aider...