> J'ai essayé de déplacer la ligne après la ligne 24
Invoke(new AddControl_Delegate(AddControl),new object[1]
{userControl1}); et dans ce cas, ca marche parfaitement !
Est-ce que quelqu'un pourrait m'aider s'il vous plait ?
> J'ai essayé de déplacer la ligne après la ligne 24
Invoke(new AddControl_Delegate(AddControl),new object[1]
{userControl1}); et dans ce cas, ca marche parfaitement !
Est-ce que quelqu'un pourrait m'aider s'il vous plait ?
> J'ai essayé de déplacer la ligne après la ligne 24
Invoke(new AddControl_Delegate(AddControl),new object[1]
{userControl1}); et dans ce cas, ca marche parfaitement !
Est-ce que quelqu'un pourrait m'aider s'il vous plait ?
> J'ai essayé de déplacer la ligne après la ligne 24
> Invoke(new AddControl_Delegate(AddControl),new object[1]
> {userControl1}); et dans ce cas, ca marche parfaitement !
>
> Est-ce que quelqu'un pourrait m'aider s'il vous plait ?
Bonjour,
Si vous remplacez le code de UselessFunction par, par exemple:
button.Text = "Autre texte";
le programme fonctionne. Le fait de manipuler la propriété Visible
*avant* que le contrôle ne soit effectivement installé dans un conteneur
(il n'a donc pas encore de parent) doit à mon avis générer des effets de
bord néfastes. En effet, manipuler cette propriété Visible avant que le
contrôle ne soit physiquement présent dans son conteneur n'a pas
vraiment de sens. Si le contrôle essaie de notifier son parent de son
nouvel état (afin que le conteneur soit rafraîchi), je suppose que ça ne
se passe pas bien.
Il faudrait désassembler le code de la propriété Visible ou de
VisibleChanged pour comprendre exactement ce qui se passe.
--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
> J'ai essayé de déplacer la ligne après la ligne 24
> Invoke(new AddControl_Delegate(AddControl),new object[1]
> {userControl1}); et dans ce cas, ca marche parfaitement !
>
> Est-ce que quelqu'un pourrait m'aider s'il vous plait ?
Bonjour,
Si vous remplacez le code de UselessFunction par, par exemple:
button.Text = "Autre texte";
le programme fonctionne. Le fait de manipuler la propriété Visible
*avant* que le contrôle ne soit effectivement installé dans un conteneur
(il n'a donc pas encore de parent) doit à mon avis générer des effets de
bord néfastes. En effet, manipuler cette propriété Visible avant que le
contrôle ne soit physiquement présent dans son conteneur n'a pas
vraiment de sens. Si le contrôle essaie de notifier son parent de son
nouvel état (afin que le conteneur soit rafraîchi), je suppose que ça ne
se passe pas bien.
Il faudrait désassembler le code de la propriété Visible ou de
VisibleChanged pour comprendre exactement ce qui se passe.
--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
> J'ai essayé de déplacer la ligne après la ligne 24
> Invoke(new AddControl_Delegate(AddControl),new object[1]
> {userControl1}); et dans ce cas, ca marche parfaitement !
>
> Est-ce que quelqu'un pourrait m'aider s'il vous plait ?
Bonjour,
Si vous remplacez le code de UselessFunction par, par exemple:
button.Text = "Autre texte";
le programme fonctionne. Le fait de manipuler la propriété Visible
*avant* que le contrôle ne soit effectivement installé dans un conteneur
(il n'a donc pas encore de parent) doit à mon avis générer des effets de
bord néfastes. En effet, manipuler cette propriété Visible avant que le
contrôle ne soit physiquement présent dans son conteneur n'a pas
vraiment de sens. Si le contrôle essaie de notifier son parent de son
nouvel état (afin que le conteneur soit rafraîchi), je suppose que ça ne
se passe pas bien.
Il faudrait désassembler le code de la propriété Visible ou de
VisibleChanged pour comprendre exactement ce qui se passe.
--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Merci pour votre réponse mais...
l'exemple que j'ai choisi est volontairement simplifié pour faire un
programme qui paraît inutile mais qui montre clairement le problème.
La question n'est pas de savoir que le fait de mettre visible a true
n'a pas de sens quand le contrôle n'est pas physiquement présent dans
son conteneur (surtout que dans le cas de mon programme qui pose
problème, pas celui de l'exemple que j'ai fourni, ça a un sens très
important) mais en fait de comprendre ce qui se passe réellement et
pourquoi ca plante.
Merci pour votre réponse mais...
l'exemple que j'ai choisi est volontairement simplifié pour faire un
programme qui paraît inutile mais qui montre clairement le problème.
La question n'est pas de savoir que le fait de mettre visible a true
n'a pas de sens quand le contrôle n'est pas physiquement présent dans
son conteneur (surtout que dans le cas de mon programme qui pose
problème, pas celui de l'exemple que j'ai fourni, ça a un sens très
important) mais en fait de comprendre ce qui se passe réellement et
pourquoi ca plante.
Merci pour votre réponse mais...
l'exemple que j'ai choisi est volontairement simplifié pour faire un
programme qui paraît inutile mais qui montre clairement le problème.
La question n'est pas de savoir que le fait de mettre visible a true
n'a pas de sens quand le contrôle n'est pas physiquement présent dans
son conteneur (surtout que dans le cas de mon programme qui pose
problème, pas celui de l'exemple que j'ai fourni, ça a un sens très
important) mais en fait de comprendre ce qui se passe réellement et
pourquoi ca plante.
Est-ce que quelqu'un a déjà essayé de créer des contrôles dans des threads
séparés ? J'ai un problème que je ne comprends pas.
Pour simplifier les explications, j'ai écrit ces quelques lignes pour
montrer un exemple du problème.
Ce programme ne fait rien d'autre que d'afficher un bouton "Start thread".
Lorsqu'il est enfoncé, un nouveau thread démarre dans lequel un usercontrol
est créé, affichant un nouveau bouton. C'est tout.
Tout fonctionne, mais si comme dans le code source je place la ligne (ligne
23)
userControl1.UselessFunction();
ça ne marche plus (ça bloque indéfiniment) et je dois tuer la tâche.
Cette fonction inutile ne fait rien d'autre que d'afficher le bouton !
Etrange, n'est-ce pas ?
J'ai essayé de déplacer la ligne après la ligne 24
Invoke(new AddControl_Delegate(AddControl),new object[1] {userControl1});
et dans ce cas, ca marche parfaitement !
Est-ce que quelqu'un pourrait m'aider s'il vous plait ?
Merci,
Ludovic SOEUR.
Voici le code source :
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
public class Form1 : Form {
[STAThread]
static void Main() {
Application.Run(new Form1());
}
public Form1() {
Button button=new Button();
button.Text = "Start thread";
button.Click += new System.EventHandler(button_Click);
Controls.Add(button);
}
private void button_Click(object sender, System.EventArgs e) {
(new Thread(new ThreadStart(StartThread))).Start();
}
private void StartThread() {
UserControl1 userControl1=new UserControl1();
userControl1.Top$;
userControl1.UselessFunction();
Invoke(new AddControl_Delegate(AddControl),new object[1] {userControl1});
}
private delegate void AddControl_Delegate(UserControl1 control);
private void AddControl(UserControl1 control) {
Controls.Add(control);
}
}
public class UserControl1 : UserControl {
private Button button=new Button();
public UserControl1() {
button.Text = "Success";
Controls.Add(button);
}
public void UselessFunction() {
button.Visibleúlse;
button.Visible=true;
}
}
Est-ce que quelqu'un a déjà essayé de créer des contrôles dans des threads
séparés ? J'ai un problème que je ne comprends pas.
Pour simplifier les explications, j'ai écrit ces quelques lignes pour
montrer un exemple du problème.
Ce programme ne fait rien d'autre que d'afficher un bouton "Start thread".
Lorsqu'il est enfoncé, un nouveau thread démarre dans lequel un usercontrol
est créé, affichant un nouveau bouton. C'est tout.
Tout fonctionne, mais si comme dans le code source je place la ligne (ligne
23)
userControl1.UselessFunction();
ça ne marche plus (ça bloque indéfiniment) et je dois tuer la tâche.
Cette fonction inutile ne fait rien d'autre que d'afficher le bouton !
Etrange, n'est-ce pas ?
J'ai essayé de déplacer la ligne après la ligne 24
Invoke(new AddControl_Delegate(AddControl),new object[1] {userControl1});
et dans ce cas, ca marche parfaitement !
Est-ce que quelqu'un pourrait m'aider s'il vous plait ?
Merci,
Ludovic SOEUR.
Voici le code source :
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
public class Form1 : Form {
[STAThread]
static void Main() {
Application.Run(new Form1());
}
public Form1() {
Button button=new Button();
button.Text = "Start thread";
button.Click += new System.EventHandler(button_Click);
Controls.Add(button);
}
private void button_Click(object sender, System.EventArgs e) {
(new Thread(new ThreadStart(StartThread))).Start();
}
private void StartThread() {
UserControl1 userControl1=new UserControl1();
userControl1.Top$;
userControl1.UselessFunction();
Invoke(new AddControl_Delegate(AddControl),new object[1] {userControl1});
}
private delegate void AddControl_Delegate(UserControl1 control);
private void AddControl(UserControl1 control) {
Controls.Add(control);
}
}
public class UserControl1 : UserControl {
private Button button=new Button();
public UserControl1() {
button.Text = "Success";
Controls.Add(button);
}
public void UselessFunction() {
button.Visibleúlse;
button.Visible=true;
}
}
Est-ce que quelqu'un a déjà essayé de créer des contrôles dans des threads
séparés ? J'ai un problème que je ne comprends pas.
Pour simplifier les explications, j'ai écrit ces quelques lignes pour
montrer un exemple du problème.
Ce programme ne fait rien d'autre que d'afficher un bouton "Start thread".
Lorsqu'il est enfoncé, un nouveau thread démarre dans lequel un usercontrol
est créé, affichant un nouveau bouton. C'est tout.
Tout fonctionne, mais si comme dans le code source je place la ligne (ligne
23)
userControl1.UselessFunction();
ça ne marche plus (ça bloque indéfiniment) et je dois tuer la tâche.
Cette fonction inutile ne fait rien d'autre que d'afficher le bouton !
Etrange, n'est-ce pas ?
J'ai essayé de déplacer la ligne après la ligne 24
Invoke(new AddControl_Delegate(AddControl),new object[1] {userControl1});
et dans ce cas, ca marche parfaitement !
Est-ce que quelqu'un pourrait m'aider s'il vous plait ?
Merci,
Ludovic SOEUR.
Voici le code source :
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
public class Form1 : Form {
[STAThread]
static void Main() {
Application.Run(new Form1());
}
public Form1() {
Button button=new Button();
button.Text = "Start thread";
button.Click += new System.EventHandler(button_Click);
Controls.Add(button);
}
private void button_Click(object sender, System.EventArgs e) {
(new Thread(new ThreadStart(StartThread))).Start();
}
private void StartThread() {
UserControl1 userControl1=new UserControl1();
userControl1.Top$;
userControl1.UselessFunction();
Invoke(new AddControl_Delegate(AddControl),new object[1] {userControl1});
}
private delegate void AddControl_Delegate(UserControl1 control);
private void AddControl(UserControl1 control) {
Controls.Add(control);
}
}
public class UserControl1 : UserControl {
private Button button=new Button();
public UserControl1() {
button.Text = "Success";
Controls.Add(button);
}
public void UselessFunction() {
button.Visibleúlse;
button.Visible=true;
}
}
Extrait de l'MSDN concernant la méthode Control.Invode :
Si le handle du contrôle n'existe pas encore, cette méthode
effectuera une recherche dans la chaîne parente du contrôle jusqu'à
ce qu'elle trouve un contrôle ou un formulaire sans handle de
fenêtre. Si aucun handle approprié n'est trouvé, la méthode Invoke
lèvera une exception. Les exceptions déclenchées au cours de l'appel
seront propagées vers l'appelant.
Extrait de l'MSDN concernant la méthode Control.Invode :
Si le handle du contrôle n'existe pas encore, cette méthode
effectuera une recherche dans la chaîne parente du contrôle jusqu'à
ce qu'elle trouve un contrôle ou un formulaire sans handle de
fenêtre. Si aucun handle approprié n'est trouvé, la méthode Invoke
lèvera une exception. Les exceptions déclenchées au cours de l'appel
seront propagées vers l'appelant.
Extrait de l'MSDN concernant la méthode Control.Invode :
Si le handle du contrôle n'existe pas encore, cette méthode
effectuera une recherche dans la chaîne parente du contrôle jusqu'à
ce qu'elle trouve un contrôle ou un formulaire sans handle de
fenêtre. Si aucun handle approprié n'est trouvé, la méthode Invoke
lèvera une exception. Les exceptions déclenchées au cours de l'appel
seront propagées vers l'appelant.
Attention la manipulation de controles dans les Windows Form doit se faire
EXCLUSIVEMENT dans le thead principal, et vu que c'est pas marqué partout
dans l'MSDN on peut facilement se faire avoir.
Pour contourner cette restrictions il faut passer par des délégués, entres
autres MethodInvoker.
Extrait de l'MSDN concernant la méthode Control.Invode :
Si le handle du contrôle n'existe pas encore, cette méthode effectuera une
recherche dans la chaîne parente du contrôle jusqu'à ce qu'elle trouve un
contrôle ou un formulaire sans handle de fenêtre. Si aucun handle
n'est trouvé, la méthode Invoke lèvera une exception. Les exceptions
déclenchées au cours de l'appel seront propagées vers l'appelant.
Remarque Quatre méthodes sur un contrôle peuvent être appelées sans
problème à partir de n'importe quel thread : Invoke, BeginInvoke,
et CreateGraphics. Pour tous les autres appels de méthode, vous devez
utiliser l'une des méthodes Invoke pour marshaler l'appel au thread du
contrôle.
Le délégué peut être une instance de EventHandler, dans ce cas, le
Sender contiendra ce contrôle, et le paramètre Event contiendra
EventArgs.Empty. Le délégué peut également être une instance de
ou tout autre délégué qui accepte une liste de paramètres Void. Un appel à
délégué EventHandler ou MethodInvoker sera plus rapide qu'un appel à un
type de délégué.
"Ludovic SOEUR" wrote:
> Est-ce que quelqu'un a déjà essayé de créer des contrôles dans des
> séparés ? J'ai un problème que je ne comprends pas.
> Pour simplifier les explications, j'ai écrit ces quelques lignes pour
> montrer un exemple du problème.
> Ce programme ne fait rien d'autre que d'afficher un bouton "Start
> Lorsqu'il est enfoncé, un nouveau thread démarre dans lequel un
> est créé, affichant un nouveau bouton. C'est tout.
> Tout fonctionne, mais si comme dans le code source je place la ligne
> 23)
> userControl1.UselessFunction();
> ça ne marche plus (ça bloque indéfiniment) et je dois tuer la tâche.
> Cette fonction inutile ne fait rien d'autre que d'afficher le bouton !
> Etrange, n'est-ce pas ?
>
> J'ai essayé de déplacer la ligne après la ligne 24
> Invoke(new AddControl_Delegate(AddControl),new object[1]
> et dans ce cas, ca marche parfaitement !
>
> Est-ce que quelqu'un pourrait m'aider s'il vous plait ?
>
> Merci,
> Ludovic SOEUR.
>
> Voici le code source :
>
> using System;
> using System.Drawing;
> using System.Windows.Forms;
> using System.Threading;
>
> public class Form1 : Form {
> [STAThread]
> static void Main() {
> Application.Run(new Form1());
> }
> public Form1() {
> Button button=new Button();
> button.Text = "Start thread";
> button.Click += new System.EventHandler(button_Click);
> Controls.Add(button);
> }
> private void button_Click(object sender, System.EventArgs e) {
> (new Thread(new ThreadStart(StartThread))).Start();
> }
> private void StartThread() {
> UserControl1 userControl1=new UserControl1();
> userControl1.Top$;
> userControl1.UselessFunction();
> Invoke(new AddControl_Delegate(AddControl),new object[1]
> }
> private delegate void AddControl_Delegate(UserControl1 control);
> private void AddControl(UserControl1 control) {
> Controls.Add(control);
> }
> }
>
> public class UserControl1 : UserControl {
> private Button button=new Button();
> public UserControl1() {
> button.Text = "Success";
> Controls.Add(button);
> }
> public void UselessFunction() {
> button.Visibleúlse;
> button.Visible=true;
> }
> }
>
>
>
Attention la manipulation de controles dans les Windows Form doit se faire
EXCLUSIVEMENT dans le thead principal, et vu que c'est pas marqué partout
dans l'MSDN on peut facilement se faire avoir.
Pour contourner cette restrictions il faut passer par des délégués, entres
autres MethodInvoker.
Extrait de l'MSDN concernant la méthode Control.Invode :
Si le handle du contrôle n'existe pas encore, cette méthode effectuera une
recherche dans la chaîne parente du contrôle jusqu'à ce qu'elle trouve un
contrôle ou un formulaire sans handle de fenêtre. Si aucun handle
n'est trouvé, la méthode Invoke lèvera une exception. Les exceptions
déclenchées au cours de l'appel seront propagées vers l'appelant.
Remarque Quatre méthodes sur un contrôle peuvent être appelées sans
problème à partir de n'importe quel thread : Invoke, BeginInvoke,
et CreateGraphics. Pour tous les autres appels de méthode, vous devez
utiliser l'une des méthodes Invoke pour marshaler l'appel au thread du
contrôle.
Le délégué peut être une instance de EventHandler, dans ce cas, le
Sender contiendra ce contrôle, et le paramètre Event contiendra
EventArgs.Empty. Le délégué peut également être une instance de
ou tout autre délégué qui accepte une liste de paramètres Void. Un appel à
délégué EventHandler ou MethodInvoker sera plus rapide qu'un appel à un
type de délégué.
"Ludovic SOEUR" wrote:
> Est-ce que quelqu'un a déjà essayé de créer des contrôles dans des
> séparés ? J'ai un problème que je ne comprends pas.
> Pour simplifier les explications, j'ai écrit ces quelques lignes pour
> montrer un exemple du problème.
> Ce programme ne fait rien d'autre que d'afficher un bouton "Start
> Lorsqu'il est enfoncé, un nouveau thread démarre dans lequel un
> est créé, affichant un nouveau bouton. C'est tout.
> Tout fonctionne, mais si comme dans le code source je place la ligne
> 23)
> userControl1.UselessFunction();
> ça ne marche plus (ça bloque indéfiniment) et je dois tuer la tâche.
> Cette fonction inutile ne fait rien d'autre que d'afficher le bouton !
> Etrange, n'est-ce pas ?
>
> J'ai essayé de déplacer la ligne après la ligne 24
> Invoke(new AddControl_Delegate(AddControl),new object[1]
> et dans ce cas, ca marche parfaitement !
>
> Est-ce que quelqu'un pourrait m'aider s'il vous plait ?
>
> Merci,
> Ludovic SOEUR.
>
> Voici le code source :
>
> using System;
> using System.Drawing;
> using System.Windows.Forms;
> using System.Threading;
>
> public class Form1 : Form {
> [STAThread]
> static void Main() {
> Application.Run(new Form1());
> }
> public Form1() {
> Button button=new Button();
> button.Text = "Start thread";
> button.Click += new System.EventHandler(button_Click);
> Controls.Add(button);
> }
> private void button_Click(object sender, System.EventArgs e) {
> (new Thread(new ThreadStart(StartThread))).Start();
> }
> private void StartThread() {
> UserControl1 userControl1=new UserControl1();
> userControl1.Top$;
> userControl1.UselessFunction();
> Invoke(new AddControl_Delegate(AddControl),new object[1]
> }
> private delegate void AddControl_Delegate(UserControl1 control);
> private void AddControl(UserControl1 control) {
> Controls.Add(control);
> }
> }
>
> public class UserControl1 : UserControl {
> private Button button=new Button();
> public UserControl1() {
> button.Text = "Success";
> Controls.Add(button);
> }
> public void UselessFunction() {
> button.Visibleúlse;
> button.Visible=true;
> }
> }
>
>
>
Attention la manipulation de controles dans les Windows Form doit se faire
EXCLUSIVEMENT dans le thead principal, et vu que c'est pas marqué partout
dans l'MSDN on peut facilement se faire avoir.
Pour contourner cette restrictions il faut passer par des délégués, entres
autres MethodInvoker.
Extrait de l'MSDN concernant la méthode Control.Invode :
Si le handle du contrôle n'existe pas encore, cette méthode effectuera une
recherche dans la chaîne parente du contrôle jusqu'à ce qu'elle trouve un
contrôle ou un formulaire sans handle de fenêtre. Si aucun handle
n'est trouvé, la méthode Invoke lèvera une exception. Les exceptions
déclenchées au cours de l'appel seront propagées vers l'appelant.
Remarque Quatre méthodes sur un contrôle peuvent être appelées sans
problème à partir de n'importe quel thread : Invoke, BeginInvoke,
et CreateGraphics. Pour tous les autres appels de méthode, vous devez
utiliser l'une des méthodes Invoke pour marshaler l'appel au thread du
contrôle.
Le délégué peut être une instance de EventHandler, dans ce cas, le
Sender contiendra ce contrôle, et le paramètre Event contiendra
EventArgs.Empty. Le délégué peut également être une instance de
ou tout autre délégué qui accepte une liste de paramètres Void. Un appel à
délégué EventHandler ou MethodInvoker sera plus rapide qu'un appel à un
type de délégué.
"Ludovic SOEUR" wrote:
> Est-ce que quelqu'un a déjà essayé de créer des contrôles dans des
> séparés ? J'ai un problème que je ne comprends pas.
> Pour simplifier les explications, j'ai écrit ces quelques lignes pour
> montrer un exemple du problème.
> Ce programme ne fait rien d'autre que d'afficher un bouton "Start
> Lorsqu'il est enfoncé, un nouveau thread démarre dans lequel un
> est créé, affichant un nouveau bouton. C'est tout.
> Tout fonctionne, mais si comme dans le code source je place la ligne
> 23)
> userControl1.UselessFunction();
> ça ne marche plus (ça bloque indéfiniment) et je dois tuer la tâche.
> Cette fonction inutile ne fait rien d'autre que d'afficher le bouton !
> Etrange, n'est-ce pas ?
>
> J'ai essayé de déplacer la ligne après la ligne 24
> Invoke(new AddControl_Delegate(AddControl),new object[1]
> et dans ce cas, ca marche parfaitement !
>
> Est-ce que quelqu'un pourrait m'aider s'il vous plait ?
>
> Merci,
> Ludovic SOEUR.
>
> Voici le code source :
>
> using System;
> using System.Drawing;
> using System.Windows.Forms;
> using System.Threading;
>
> public class Form1 : Form {
> [STAThread]
> static void Main() {
> Application.Run(new Form1());
> }
> public Form1() {
> Button button=new Button();
> button.Text = "Start thread";
> button.Click += new System.EventHandler(button_Click);
> Controls.Add(button);
> }
> private void button_Click(object sender, System.EventArgs e) {
> (new Thread(new ThreadStart(StartThread))).Start();
> }
> private void StartThread() {
> UserControl1 userControl1=new UserControl1();
> userControl1.Top$;
> userControl1.UselessFunction();
> Invoke(new AddControl_Delegate(AddControl),new object[1]
> }
> private delegate void AddControl_Delegate(UserControl1 control);
> private void AddControl(UserControl1 control) {
> Controls.Add(control);
> }
> }
>
> public class UserControl1 : UserControl {
> private Button button=new Button();
> public UserControl1() {
> button.Text = "Success";
> Controls.Add(button);
> }
> public void UselessFunction() {
> button.Visibleúlse;
> button.Visible=true;
> }
> }
>
>
>