éxécution de thread et affichege simultané de winform

Messages postés
6
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
12 septembre 2006
-
Messages postés
6
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
12 septembre 2006
-
Bonjour,


j'ai un souci pour dans l'application que je suis en train de développer.


Au démarrage je charge mes données depuis une base de données et durant ce chargement je souhaite faire apparaitre une fenêtre de chargement avec un gif animé.


Au départ j'affichai juste une winform avec une image en fond en mode non modal, puis j'éxécutai dans la foulée l'appel de mon objet responsable du chargement. Cet appel étant dans un bloc try et la fonction de chargement générant une exception  une fois terminée je controllai ainsi mon affichage.

Le problème est apparu quand j'ai voulu ajouter un label et un gif animé dans la winform. Ils apparaissaient comme transparent. Seul l'utilisation de showDialog() les fait apparraitre dans leur fenetre mère.

Voici les idées que j'ai eues et selon moi pourquoi j'ai échoué : showDialog ne peut être éxécuté en thread (du moins me semble-t-il) ce serait pourtant la solution la plus facile pour moi.
            L'utilisation d'un thread pour mon chargement m'empêche de gèrer les exeption dans le processus principal et crée donc une erreur système.
            Troisième solution : généré un événement au lieu d'une exception malheureusement l'appel se fait depuis le main donc pas de fonction de récupération d'événement.

si vous voyez une autres idée ou que l'un de mes échecs ne vous semble pas justifié aidez moi svp.
Je serai preneur d'une explication sur la transparence de mes composant avec la méthode show() aussi. Juste histoire de pas mourir bête

merci d'avance,
jon

3 réponses

Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010
2
Est ce que le thread que tu génères rend la main à ton thread principal (par exemple avec un application.DoEvents) ?

Théo
Messages postés
6
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
12 septembre 2006

en fait il me semble que le thread principal garde la main puisque l'affichage se fait et que l'exception généré par le thread n'est pas gérée. Ce sera peut-être plus clair avec ce bout de code:
cela commence après l'authentification de l'utilisateur, fond est ma winform de chagement








if
(f.ShowDialog() == DialogResult.OK)

//identification de l'utilisateur

{




//programme principal identifié

Caisse myCaisse =




new
Caisse(caisId,f.LogiId,f.UtilId);Thread loader =


new
Thread(

new
ThreadStart(myCaisse.load));


try

{


loader.Start();


fond.ShowDialog();


}







catch

{


fond.Dispose();


CaisseController controller =




new
CaisseController(myCaisse);}

}

et voici le bout de code appelé par le thread:

public





void
load(){


//on initialise la caisse grâce à la classe InitCaisse membre de l'espace DAL

InitCaisse init =




new
InitCaisse(

this
);


try

{


init.load();


}







catch
//on récupère l'éxception générée à la fin de l'initialisation

{







//on libère init et on s'assure ainsi de la fermeture de la connection à la base

init.Dispose();







this
.fondWait.Dispose();


throw



new
Exception();}

}
Messages postés
6
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
12 septembre 2006

Bon finallement j'ai réussi à me dépatouillé en générant un événement à la fin du chargement et en abonnant ma vue à cet événement via le main. J'ai juste eu a crée une méthode dans ma vue qui implémente la valeur dialogresult de showDialog().


Merci à ceux qui ont réfléchi à mon problème et pour ceux que ça intéresse la correction de ce que j'avais:








if
(f.ShowDialog() == DialogResult.OK)

//identification de l'utilisateur

{




//programme principal identifié

Caisse myCaisse =




new
Caisse(caisId,f.LogiId,f.UtilId);myCaisse.endLoad +=


new
endLoadEventHandler(fond.finish);Thread loader =


new
Thread(

new
ThreadStart(myCaisse.load));

loader.Start();

fond.ShowDialog();


while
(fond.IsDisposed !=

true
){

fond.Dispose();

}

CaisseController controller =


new
CaisseController(myCaisse);}

et du côté chargement:


public



void
load(){


//on initialise la caisse grâce à la classe InitCaisse membre de l'espace DAL

InitCaisse init =




new
InitCaisse(

this
);


try

{


init.load();


}







catch
//on récupère l'éxception générée à la fin de l'initialisation

{







//on libère init et on s'assure ainsi de la fermeture de la connection à la base

init.Dispose();







this
.fondWait.Dispose();


//throw new Exception();






this
.endLoad();}

} avec endLoad qui est un public event personnalisé.