[C#] [thread]

Résolu
clairenes Messages postés 24 Date d'inscription lundi 8 août 2005 Statut Membre Dernière intervention 30 août 2005 - 10 août 2005 à 10:38
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 - 11 août 2005 à 08:40
salut tout le monde!

je n'y comprends plus rien!

j'ai crée un thread qui lance une fonction qui remplie un dataset mais
etrangement il arrive au datareader.fill() et il ne me dit plus rien!
en plus l'etat de mon thread reste toujours a Unstarted et ce n'est pas
parce ca va trop vite j'ai deja essayer avec le sleep().

j'ai egalement essayer de rejouter le .join() mais ca ne change rien non plus!

en gros je ne sais vraiment plus quoi faire! une idee?? svp

18 réponses

SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
11 août 2005 à 08:40
Voilà, c'est fait.

Va donc jeter un coup d'oeil ici.
Amicalement, SharpMao
3
clairenes Messages postés 24 Date d'inscription lundi 8 août 2005 Statut Membre Dernière intervention 30 août 2005
10 août 2005 à 10:40
desolee c'est pas datareader.fill() c'est dataAdapter().fill me suis trompée
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
10 août 2005 à 11:03
Hello,

Où as-tu mis ton sleep ? Si ce n'est pas ce que tu as fait, essaie de le mettre après le t.Start() et la MessageBox.
Je ne suis pas un pro des threads, mais peut-être que ton thread principal éxécute le MessageBox.Show avant que ton thread secondaire n'ait changé d'état.

Amicalement, SharpMao
0
clairenes Messages postés 24 Date d'inscription lundi 8 août 2005 Statut Membre Dernière intervention 30 août 2005
10 août 2005 à 11:28
j'ai reessayé au cas ou mais ca ne marche pas non plus
0

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

Posez votre question
clairenes Messages postés 24 Date d'inscription lundi 8 août 2005 Statut Membre Dernière intervention 30 août 2005
10 août 2005 à 11:31
voici mon code au cas ou ca puisse aider:



public static DataSet ds;

public static Thread t ;



public int EtatConnection()

{

string
ChaineConnOracle =
ConfigurationSettings.AppSettings["authentification"]+"User
Id="+UserName+";Password="+UserPass+"";

MessageBox.Show(ChaineConnOracle);




OracleConnection MaConnection = new
OracleConnection(ChaineConnOracle);



try

{



MaConnection.Open();

MessageBox.Show(MaConnection.State.ToString());



ThreadArgs ta = new ThreadArgs(MaConnection);




t = new Thread(new
ThreadStart(ta.ChargementDataSet));


MessageBox.Show("etat1 du thread :
"+t.ThreadState);

t.Start();


MessageBox.Show("etat2 du thread : "+t.ThreadState);

Thread.Sleep(2000);

t.Join();


MessageBox.Show("etat3 du thread : "+t.ThreadState);






//dg = new MonDelegate(ChargementDataSet);


// Async = dg.BeginInvoke(MaConnection,null,null);

}

catch(Exception ex)

{


MessageBox.Show("Non connecte\nErreur: " +
ex.Message);

return 0;

}

return
1;

}

}



public class ThreadArgs

{



public OracleConnection MaConnection;





public ThreadArgs(OracleConnection _MaConnection)

{

MaConnection = _MaConnection;

}



public void ChargementDataSet()

{

MessageBox.Show("je charge le dataset");



string requete1 = "select * from VW_LIAISONS_TABLES";

//string requete2 = "select * from VW_TABLE_COLUMN";



MessageBox.Show(requete1);

ChangementSession();




OracleDataAdapter MaCommande = new
OracleDataAdapter(requete1,MaConnection);




//OracleDataAdapter MaCommande2 = new
OracleDataAdapter(requete2,MaConnection);





ConnectionAuthentification.ds = new DataSet();

MessageBox.Show("creation dataset");



MaCommande.Fill(ConnectionAuthentification.ds,"Table1");

//MaCommande2.Fill(ds,"Table2");

MaCommande.Dispose();

//MaCommande2.Dispose();




MessageBox.Show("ca y est! dataset chargé et connection libérée!!");

MaConnection.Close();






}
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
10 août 2005 à 11:41
Hello,

Dans quel ordre arrivent tes MessageBoxes?

Amicalement, SharpMao
0
clairenes Messages postés 24 Date d'inscription lundi 8 août 2005 Statut Membre Dernière intervention 30 août 2005
10 août 2005 à 11:53
voila ce qu'il me dit :

etat1 Unstarted

etat2 Unstarted

etat3 Stopped
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
10 août 2005 à 13:35
Les messageBoxes du ChargementDataSet n'apparaissent jamais ?

Amicalement, SharpMao
0
clairenes Messages postés 24 Date d'inscription lundi 8 août 2005 Statut Membre Dernière intervention 30 août 2005
10 août 2005 à 14:12
si tous ceux qui se situent avant le DataAdapter.Fill() mais
apres plus rien! enfin si mais pas de cette fonction, il retourne sur
EtatConnection().
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
10 août 2005 à 14:16
Je suis peut-être un peut lourd mais as-tu essayé :


t.Start();
Thread.Sleep(2000);
MessageBox.Show("etat2 du thread : "+t.ThreadState);

Amicalement, SharpMao
0
clairenes Messages postés 24 Date d'inscription lundi 8 août 2005 Statut Membre Dernière intervention 30 août 2005
10 août 2005 à 14:31
lourd?? tu rigoles ou quoi?? 3 jours que je rame la dessus, j'accepte
de tester toutes les idees que tu as! et en plus ca marche! il passe a
l'etat Running! mais alors pourquoi il n'atteind jamais la suite de la
fonction? en plus ça voudrait dire que le chargement est super rapide
alors que lorsque je le chargeais en dehors du thread il me prennait
qques bonnes minutes et puis lorsque je lui demande de me faire
apparaitre les donnees dans un dataGrid je n'ai rien. Est ce qu'il faut
faire un truc spécifique apres?
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
10 août 2005 à 14:41
Hello,

Voivi a mon avis ce qui se passait :

Une fois le t.Start fait, ton thread principal exécute directement
MessageBox.Show("etat2 du thread : "+t.ThreadState);
sans laisser le temps au thread t de changer d'état.
Comme ton Fill prend beaucoup de temps, et que tu avais l'état Unstarted, tu pensais que quelque chose n'allais pas, et tu arrêtais le processus avant la fin.

Thread principal Thread t
---------------- --------
|
t.Start()------------------>
MessageBox |
| t.ThreadState = Runing
| ChargementDataSet()
| |
... ...


Amicalement, SharpMao
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
10 août 2005 à 14:45
En plus, si ton Fill est si lent, et que tu demande de remplir un DataGrid avec un DataSet pas encore complétement rempli, je ne sais pas comment il réagit.
Au fait, comment ça se fait qu'il soit aussi lent, il y a des millions de lignes dans cette tables ??

Amicalement, SharpMao
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
10 août 2005 à 14:52
Bien vu le schéma SharpMao ; )

Moi non plus je ne voudrais pas être lourd mais ca fait 2 jours que j'ai dit qu'il fallait mettre Sleep après Start.

http://www.csharp.fr/forum.v2.aspx?ID=530368#3
0
clairenes Messages postés 24 Date d'inscription lundi 8 août 2005 Statut Membre Dernière intervention 30 août 2005
10 août 2005 à 14:54
pas loin oui. mais comment ca j'arretais le processus avant la fin? il
faut que je fasse quoi pour lui permettre de continuer jusqu'a ce qu'il
arrive au bout? la je bloque, desolée de t'embêter autant
0
clairenes Messages postés 24 Date d'inscription lundi 8 août 2005 Statut Membre Dernière intervention 30 août 2005
10 août 2005 à 15:06
pour Lutinore :

vraiment dsl je l'ai mal placé comme tu as pu le voir, je te fais mes
plus plates excuses! l'autre jour quand je l'ai teste ça a marché
depuis j'ai fait des modifs et je ne l'ai pas replacé au bon endroit.

pour tout le monde :

en fait , si j'ai bien compris ce dont j'ai besoin c'est d'un moyen de
signaler a ma fonction de remplissage du dataGrid que la chargement du
dataset est terminé. Est ce que pour cela il faut que je créé un
nouveau thread? ou c'est possible plus simplement?
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
10 août 2005 à 16:48
Un moyen que je vois, c'est d'ajouter un event à ta classe ThreadArgs, afin de pouvoir déclencher cet event lorsque la méthode est terminée. Si tu ne sait pas comment faire, dis-le moi, j'essaierai de poster une source demain à ce sujet.

Amicalement, SharpMao
0
clairenes Messages postés 24 Date d'inscription lundi 8 août 2005 Statut Membre Dernière intervention 30 août 2005
10 août 2005 à 18:20
je veux bien de cette source oui. merci beaucoup pour toute ton aide aujourd'hui.
0
Rejoignez-nous