Les threads....

Résolu
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 - 17 janv. 2005 à 10:02
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 - 17 janv. 2005 à 11:27
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

Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 14
17 janv. 2005 à 11:27
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..."
3
ivanoff1 Messages postés 99 Date d'inscription lundi 14 octobre 2002 Statut Membre Dernière intervention 28 décembre 2005
17 janv. 2005 à 10:30
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!!
0
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 14
17 janv. 2005 à 10:34
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..."
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
17 janv. 2005 à 10:38
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
0

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

Posez votre question
ivanoff1 Messages postés 99 Date d'inscription lundi 14 octobre 2002 Statut Membre Dernière intervention 28 décembre 2005
17 janv. 2005 à 10:41
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!!
0
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 14
17 janv. 2005 à 10:50
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..."
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
17 janv. 2005 à 10:59
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.
0
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 14
17 janv. 2005 à 11:10
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..."
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
17 janv. 2005 à 11:13
Au moins ce serait résolu si c'était ca ! :)
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
17 janv. 2005 à 11:22
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#
0
Rejoignez-nous