Les threads.... [Résolu]

Signaler
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
-
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
-
Salut tout le monde,

j'ai une petite question concernant les threads....
Voila le contexte, j'ai un objet herite d'un datagrid qui permet de charger des données en parametrant 2 trois proprietes directement dans le mode design et en lancant une fonction...

en fait j'ai 2 select possible, un qui sera execute normalement (ie dans le thread principale de l'appli) qui permettra d'afficher un certain nombre de ligne tout de suite, le 2eme select est la lui pour remplir le reste du datagrid je m'explique, j'ai une table de 200 000 lignes, si je charge tout a partir du thread de l'appli ca rame, donc mon premier select charge les 1000 premieres lignes et le 2eme select (qui sera lancer dans un thread différent) charge les 199 000 autres lignes comme ca l'utilisateur a l'impression que c charger alors que ca continu a bosser derriere :o)

seulement voila....
g donc une méthode qui me lance le premier select affiche le resultat, et lance dans un 2eme thread l'autre select...
a un moment g vu qu'il fallait faire un thread.Abort() ou un truc du style...
pour arreter le thread...
a priori ca le fait ...mais si je ferme la fenetre et que je relance...pouf ca plante...erreur de memoire, jamais la meme erreur...la fete...

par contre si je bloque le 2eme select he ben pas de pb (car a mon avis pas de thread en +)
je lance la fenetre autant de fois que je veux...

une idee...

l'interet de faire un thread.sleep(..)
thread.join()??????

Help....


Arthenius

"Il n'y a pas de mauvais développeurs,...
mais uniquement de mauvais utilisateurs..."

10 réponses

Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
13
ARGHhhhhhhhhhhhhhhhh

c'etait ca :o)))

desole pour le derangement et merci de votre aide cammarade...

Donc pour eviter les PBs avec les threads :

INSTALLER AU MOINS LE framework 1.1 SP1 !!!!


Arthenius

"Il n'y a pas de mauvais développeurs,...
mais uniquement de mauvais utilisateurs..."
Messages postés
99
Date d'inscription
lundi 14 octobre 2002
Statut
Membre
Dernière intervention
28 décembre 2005

A mon avis, tu dois faire un thread.join.
Ton deuxième thread va alors attendre que le premeir à charger les 1000 premières lignes, non ?


L'ours a programme du miel!!
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
13
heuuu...
en fait le premier select je le fais pas dans un thread a part (enfin celui de l'appli mais rien de plus)

par contre le "gros" select est fait dans un thread a part pour pas bloquer l'appli...
donc d'apres toi je lance mon thread...et apres je fais un join...

a ce moment je sais que le thread est fini....
mais y a qd meme kkchose que je comprend pas...si je fais un thread.abort() je suis censer terminer mon thread, alors pkoi ca pose probleme qd je ferme et relance la forme ???
?.?????????????????


Arthenius

"Il n'y a pas de mauvais développeurs,...
mais uniquement de mauvais utilisateurs..."
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
Ca plante seulement quand le second Thread n'est pas terminé ? (les 190000 lignes pas remplies), ou meme quand il a fini ?



Le t.Join() sert a attendre que le thread t se termine il me semble.

Donc si tu fais un t.Join() A partir du Thread principal, ca va te bloquer ton application je pense :/



Si tu fais, a la fermeture de la fenetre, qqchose comme



(if t != null && t.isAlive)

{

t.Abort();

t = null ;

}



Ca fait quoi quand tu reouvres la fenetre ?



Ah oui, aussi, il faut absolument reinitialiser ton Thread a la reouverture de la fenetre. (Recreer l'instance de t)



Dis nous ce que ca donne, et on va continuer a chercher apres.



(au fait, tu as un exemple d'erreurs que ca provoque ?)



Mx
Messages postés
99
Date d'inscription
lundi 14 octobre 2002
Statut
Membre
Dernière intervention
28 décembre 2005

Désolé jme suis trompé!

En fait tu vas bloquer ton deuxième thread tant que le premier n'a pas fini son chargement.
La méthode "abort" permet d'arrêter complètement le thread ( et de le détruire après => GC)

Tu peux soit utiliser l'événement "Mutex" ou alors utiliser le mot clé "lock"

Genre :
lock (valeur)
{
// traitement
}

Dans le lancement de ton programme, tu dois utliser le "join", il permet d'attendre qu'un autre Thread ait fini son exécution avant de commencer le sien.

Après dans ta classe, il faut utiliser faire :

lock(this)
{
try
{
Monitor.Wait (this); // attendre le Monitor.Pulse d'un autre thread
}
}


L'ours a programme du miel!!
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
13
bon je vais tester tout ca...
et je vous tiens au cournat...

Mx : mon thread est defini dans ma fenetre il sera donc reinitialiser d'office...
j'avais essayer sur le closing de faire un abort

mais meme punition

les erreur c des fois des memoryoverflow et des trucs du genre...

ivanof : rien compris :o((( a ca ???
lock(this)
{
try
{
Monitor.Wait (this); // attendre le Monitor.Pulse d'un autre thread
}
}

et le mutex kesako ???


Arthenius

"Il n'y a pas de mauvais développeurs,...
mais uniquement de mauvais utilisateurs..."
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
Il me semblait que la classe Monitor servait a gérer les accés
concurrents ? Ca n'a pas l'air d'etre le cas ici, si ? Les 2 threads
accédent a des ressources différentes.

La seule chose qu'on en commun les 2 threads, ce se le datagrid pour le
remplissage final. Et Arthenius dit qu'il lance le 2eme thread une fois
que le premier est fini. Donc ils n'essaient pas de remplir le datagrid
en meme temps, a priori le probleme ne vient pas de la.
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
13
correct Mx...
je n'accede pas au datagrid en simultane mais je le rempli en 2 fois...

bon par contre je viens de faire le test sur une autre machine avec le meme prog et ca marche......

a priori pas le meme framework 1.1 et 1.1 sp1 suir celle qui marche...je regarde si c ca...
et la j'aurai les boules.....


Arthenius

"Il n'y a pas de mauvais développeurs,...
mais uniquement de mauvais utilisateurs..."
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
Au moins ce serait résolu si c'était ca ! :)
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
Déjà le fait d'accéder à un contrôle depuis un autre thread que celui qui l'a crée n'est pas trop conseillé.
Pour ce qui est de l'accès concurrent : si l'utilisateur fait scroller le contrôle (par exemple) alors que tu es encore en train d'y ajouter tes items, il y a des risques là :-)

Cocoricoooooooo !!!!
coq
MVP Visual C#