Probléme thread

cs_technicienne Messages postés 28 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 25 mai 2010 - 11 juin 2009 à 17:03
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 - 18 juin 2009 à 10:56
salut tout le monde
veuillez corriger le code suivant car il donne une erreur lors de son execution et merci d'avance:
Code:
void

valider(){
if (textBox1.Text "" || textBox2.Text
""){

MessageBox.Show(
"vous avez oubliez de rentre un champs obligatoire",
"error champs!!!",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
errorProvider1.SetError(textBox1,
"oublie de champs");
errorProvider1.SetError(textBox2,
"oublie de champs");
textBox2.Clear();
textBox1.Clear();
textBox1.Focus();}

try{
sqlconnection.Open();}

catch{

MessageBox.Show(
"Failed to connect to data source");}

finally{

SqlCommand comm;
comm =
new
SqlCommand(
"select * from utilisateurs where login='" + textBox1.Text +
"' and pwd='" + textBox2.Text +
"'", sqlconnection);
comm.Parameters.Add(
"login", textBox1.Text);
comm.Parameters.Add(
"password", textBox2.Text);
comm.Connection = sqlconnection;

SqlDataReader rd;

try{
rd = comm.ExecuteReader();

if (rd.Read())
{
menu m =
new
menu();

this.Hide();
m.ShowDialog ();

this.Close();}}

catch (
Exception er){

MessageBox.Show(
this,
"Login ou Mot de passe invalide",
"",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
textBox1.Text = er.ToString();}}}

#endregion
private
void button1_Click(
object sender,
EventArgs e){

Thread t1 =
new
Thread(
new
ThreadStart(valider));
t1.Start(); }

L'ereur: Opération inter-threads non valide : le contrôle 'connexion' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.

10 réponses

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
11 juin 2009 à 17:25
"veuillez corriger le code suivant"

Tu voulais surement dire :
"Pourriez-vous, s'il vous plaît, m'aider à trouver la raison pour laquelle l'exception est levée dans ce bout de code ?"
On t'aurait répondu :
"Bien volontiers. Il se trouve que créer un objet connexion directement dans le nouveau thread devrait probablement t'éviter de rencontrer cette erreur. Bonne fin de journée à toi !"

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
0
cs_technicienne Messages postés 28 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 25 mai 2010
11 juin 2009 à 17:42
Merci beaucoup pour le conseil et je m'execuse si j'étais impolie dans mon message.
0
cs_technicienne Messages postés 28 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 25 mai 2010
11 juin 2009 à 17:48
Le problème n'est pas résolu ,je vous remercie beaucoup si vous pouvez me donner plus de détailles. 
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
11 juin 2009 à 23:14
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_technicienne Messages postés 28 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 25 mai 2010
12 juin 2009 à 11:07
je vous remercie pour votre aide.
J'ai lu cette article et je veux votre opinion sur ce que j'ai compris
dnc il faut insérer delegate et utiliser invoke.
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
12 juin 2009 à 18:49
Bonsoir
Oui c'est l'idée.

en fait une règle d'or:
Ne jamais, avec un grand J, acceder aux ressources graphiques d'une application depuis un thread parrallel.

pourquoi ?
Parceque seul le thread ayant créé les composants graphique est connecté à la pompe à message du systeme.

La solution:
Faire faire au thread possedant les objets graphiques les opérations necessaires, et cela s'appelle de la délegation par invocation.
On crée donc un delegate, dans le thread d'origine et on invoke son execution. le thread demandeur sera en quelque sorte suspendu jusqu'à la fin de l'execution.

C# is amazing, enjoy it!
0
cs_technicienne Messages postés 28 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 25 mai 2010
15 juin 2009 à 13:04
salut
Merci encor une fois pour votre aider
Pourriez-vous, s'il vous plaît, me corriger cette extrait de code??
public

partial
class
connexion :
Form{

private
Thread t;

public connexion(){
InitializeComponent();}

private
delegate
void
Validation (
string login,
string pwd);

#region identification

public
void valide(){

SqlConnection connexion =
new
SqlConnection(
"Data source=MAITRE\\SQLEXPRESS;Initial Catalog=AT_homologation;Integrated Security=True ");
if (textBox1.Text "" || textBox2.Text
""){

MessageBox.Show(
"vous avez oubliez de rentre un champs obligatoire",
"error champs!!!",
MessageBoxButtons.OK,
MessageBoxIcon.Information);...
}

try{connexion.Open();}

catch{
MessageBox.Show(
"Failed to connect to data source");}

finally{

SqlCommand comm;
comm =
new
SqlCommand(
"select * from utilisateurs where login='" + textBox1.Text +
"' and pwd='" + textBox2.Text +
"'", connexion);
comm.Parameters.Add(
"login", textBox1.Text);
comm.Parameters.Add(
"password", textBox2.Text);
comm.Connection = connexion;

SqlDataReader rd;

try{
rd = comm.ExecuteReader();

if (rd.Read()){

menu m =
new
menu();

this.Hide();
m.ShowDialog ();

this.Close();}connexion.Close();}

catch (
Exception er){

MessageBox.Show(
this,
"Login ou Mot de passe invalide",
"",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
textBox1.Text = er.ToString();}} }

#endregion
private
delegate
int
LoadArray(
string[] array);

private
int LoadStringArray(
string[] array){

return array.Length;}

private
void ThreadMethod(){

IAsyncResult ias =
this.BeginInvoke(
new
LoadArray(LoadStringArray

this.Invoke(
new
Validation (valide));

int count = (
int)
this.EndInvoke(ias);

MessageBox.Show(count.ToString());

this.Invoke(
new
Validation (valide));}

private
void button1_Click(
object sender,
EventArgs e){
t =
new
Thread(
new
ThreadStart(ThreadMethod ));
t.Start();
merci d'avance
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
17 juin 2009 à 21:41
bonsoir
dis-nous plus exactement ce qui ne va pas,
on ne peux sincerement pas compiler et executer tous les codes de tout le monde.
mais si tu précise ton problem, alors on essayera de t'aider, promis ;-)

C# is amazing, enjoy it!
0
cs_technicienne Messages postés 28 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 25 mai 2010
18 juin 2009 à 09:57
salut
je vous remercie beaucoup pour votre aide et j'éspére que ça ne vous dérange pas.
this.Invoke(new
Validation (valide));
int count = (int)this.EndInvoke(ias);
MessageBox.Show(count.ToString());
this
.Invoke(newValidation (valide));}

et voila l'erreur Error 
 No overload for 'valide' matches delegate 'gestion_facture.connexion.Validation' ..... 80 25 gestion_facture
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
18 juin 2009 à 10:56
Quand tu crées ton delegate "Validation", il doit avoir EXACTEMENT la même forme que valide();

exemple :
si valide a ce prototype : void valide();
alors Validation doit être comme ça : delegate void Validation();

si valide a ce prototype : int valide(MaClassePerso monObjet, string monTexte);
alors Validation doit être comme ça : delegate int Validation(MaClassePerso monObjet, string monTexte);

La SEULE chose qui peut changer, c'est l'accessibilité (public, private, protected, internal), en fonction de tes besoins.

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
0
Rejoignez-nous