Je voudrais qu'un thread en attente de lecture de socket, renseigne une
form avec les données reçues.
Mais j'ai cette erreur:
----------------------------------------------------------------------------
Une exception non gérée du type 'System.ArgumentException' s'est
produite dans system.windows.forms.dll
Informations supplémentaires : Les contrôles créés sur un thread ne
peuvent pas être parents d'un contrôle d'un autre thread.
----------------------------------------------------------------------------
J'ai fait une classe 'client' qui créé son thread, et qui appelle une
callback de la classe 'form' qui l'a créé.
Y-a-t-il un moyen de faire ceci (par message ?), ou faut-il repenser tout ?
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
Jean-Marc Hilaire\(MS\)
Par défaut les controls ne sont pas thread safe, ils ne peuvent être manipulés par un thread autre que celui qui les a créés. Donc pour faire ce que vous voulez faire il faut marshaler les appels sur le thread qui a créé les controls, pour cela vous avez le choix d'utiliser des méthodes comme invoke, begininvoke, end invoke, etc
Par exemple vous créez dans votre form une méthode qui met à jour vos controles qu'on appelera UpdateControl par exemple
private void UpdateControl () {
//mise à jour des valeurs MonControl.Propriete = valeur; etc.
}
dans la méthode associée au thread vous aurez ce genre de code :
public void ThreadProc() {
try { MethodInvoker mi = new MethodInvoker(this.UpdateControl );
//Appel de BeginInvoke sur la Form this.BeginInvoke(mi);
etc
"herbert" wrote in message news:
bonjour,
Je voudrais qu'un thread en attente de lecture de socket, renseigne une form avec les données reçues.
Mais j'ai cette erreur: ---------------------------------------------------------------------------- Une exception non gérée du type 'System.ArgumentException' s'est produite dans system.windows.forms.dll
Informations supplémentaires : Les contrôles créés sur un thread ne peuvent pas être parents d'un contrôle d'un autre thread. ----------------------------------------------------------------------------
J'ai fait une classe 'client' qui créé son thread, et qui appelle une callback de la classe 'form' qui l'a créé.
Y-a-t-il un moyen de faire ceci (par message ?), ou faut-il repenser tout ?
merci
Par défaut les controls ne sont pas thread safe, ils ne peuvent être
manipulés par un thread autre que celui qui les a créés. Donc pour faire ce
que vous voulez faire il faut marshaler les appels sur le thread qui a créé
les controls, pour cela vous avez le choix d'utiliser des méthodes comme
invoke, begininvoke, end invoke, etc
Par exemple vous créez dans votre form une méthode qui met à jour vos
controles qu'on appelera UpdateControl par exemple
private void UpdateControl () {
//mise à jour des valeurs
MonControl.Propriete = valeur;
etc.
}
dans la méthode associée au thread vous aurez ce genre de code :
public void ThreadProc() {
try {
MethodInvoker mi = new MethodInvoker(this.UpdateControl );
//Appel de BeginInvoke sur la Form
this.BeginInvoke(mi);
etc
"herbert" <herbert.vongrunenwald@microsoft.com> wrote in message
news:OWZoEOoGFHA.588@TK2MSFTNGP15.phx.gbl...
bonjour,
Je voudrais qu'un thread en attente de lecture de socket, renseigne une
form avec les données reçues.
Mais j'ai cette erreur:
----------------------------------------------------------------------------
Une exception non gérée du type 'System.ArgumentException' s'est produite
dans system.windows.forms.dll
Informations supplémentaires : Les contrôles créés sur un thread ne
peuvent pas être parents d'un contrôle d'un autre thread.
----------------------------------------------------------------------------
J'ai fait une classe 'client' qui créé son thread, et qui appelle une
callback de la classe 'form' qui l'a créé.
Y-a-t-il un moyen de faire ceci (par message ?), ou faut-il repenser tout
?
Par défaut les controls ne sont pas thread safe, ils ne peuvent être manipulés par un thread autre que celui qui les a créés. Donc pour faire ce que vous voulez faire il faut marshaler les appels sur le thread qui a créé les controls, pour cela vous avez le choix d'utiliser des méthodes comme invoke, begininvoke, end invoke, etc
Par exemple vous créez dans votre form une méthode qui met à jour vos controles qu'on appelera UpdateControl par exemple
private void UpdateControl () {
//mise à jour des valeurs MonControl.Propriete = valeur; etc.
}
dans la méthode associée au thread vous aurez ce genre de code :
public void ThreadProc() {
try { MethodInvoker mi = new MethodInvoker(this.UpdateControl );
//Appel de BeginInvoke sur la Form this.BeginInvoke(mi);
etc
"herbert" wrote in message news:
bonjour,
Je voudrais qu'un thread en attente de lecture de socket, renseigne une form avec les données reçues.
Mais j'ai cette erreur: ---------------------------------------------------------------------------- Une exception non gérée du type 'System.ArgumentException' s'est produite dans system.windows.forms.dll
Informations supplémentaires : Les contrôles créés sur un thread ne peuvent pas être parents d'un contrôle d'un autre thread. ----------------------------------------------------------------------------
J'ai fait une classe 'client' qui créé son thread, et qui appelle une callback de la classe 'form' qui l'a créé.
Y-a-t-il un moyen de faire ceci (par message ?), ou faut-il repenser tout ?
merci
herbert
Jean-Marc Hilaire(MS) wrote:
Par défaut les controls ne sont pas thread safe, ils ne peuvent être manipulés par un thread autre que celui qui les a créés. Donc pour faire ce que vous voulez faire il faut marshaler les appels sur le thread qui a créé les controls, pour cela vous avez le choix d'utiliser des méthodes comme invoke, begininvoke, end invoke, etc
Par exemple vous créez dans votre form une méthode qui met à jour vos controles qu'on appelera UpdateControl par exemple
private void UpdateControl () {
//mise à jour des valeurs MonControl.Propriete = valeur; etc.
}
dans la méthode associée au thread vous aurez ce genre de code :
public void ThreadProc() {
try { MethodInvoker mi = new MethodInvoker(this.UpdateControl );
//Appel de BeginInvoke sur la Form this.BeginInvoke(mi);
etc
merci !
et j'aurais voulu savoir autre chose:
comment placer les items d'un ListView avec des coordonnées ?
(en MFC il y avait CListCtrl.SetItemPosition(...))
merci
Jean-Marc Hilaire(MS) wrote:
Par défaut les controls ne sont pas thread safe, ils ne peuvent être
manipulés par un thread autre que celui qui les a créés. Donc pour faire ce
que vous voulez faire il faut marshaler les appels sur le thread qui a créé
les controls, pour cela vous avez le choix d'utiliser des méthodes comme
invoke, begininvoke, end invoke, etc
Par exemple vous créez dans votre form une méthode qui met à jour vos
controles qu'on appelera UpdateControl par exemple
private void UpdateControl () {
//mise à jour des valeurs
MonControl.Propriete = valeur;
etc.
}
dans la méthode associée au thread vous aurez ce genre de code :
public void ThreadProc() {
try {
MethodInvoker mi = new MethodInvoker(this.UpdateControl );
//Appel de BeginInvoke sur la Form
this.BeginInvoke(mi);
etc
merci !
et j'aurais voulu savoir autre chose:
comment placer les items d'un ListView avec des coordonnées ?
(en MFC il y avait CListCtrl.SetItemPosition(...))
Par défaut les controls ne sont pas thread safe, ils ne peuvent être manipulés par un thread autre que celui qui les a créés. Donc pour faire ce que vous voulez faire il faut marshaler les appels sur le thread qui a créé les controls, pour cela vous avez le choix d'utiliser des méthodes comme invoke, begininvoke, end invoke, etc
Par exemple vous créez dans votre form une méthode qui met à jour vos controles qu'on appelera UpdateControl par exemple
private void UpdateControl () {
//mise à jour des valeurs MonControl.Propriete = valeur; etc.
}
dans la méthode associée au thread vous aurez ce genre de code :
public void ThreadProc() {
try { MethodInvoker mi = new MethodInvoker(this.UpdateControl );
//Appel de BeginInvoke sur la Form this.BeginInvoke(mi);
etc
merci !
et j'aurais voulu savoir autre chose:
comment placer les items d'un ListView avec des coordonnées ?
(en MFC il y avait CListCtrl.SetItemPosition(...))