Focus sur un Formulaire créé dans un Thread

AlexBob789 Messages postés 8 Date d'inscription mardi 2 mars 2004 Statut Membre Dernière intervention 14 septembre 2008 - 26 avril 2006 à 08:29
AlexBob789 Messages postés 8 Date d'inscription mardi 2 mars 2004 Statut Membre Dernière intervention 14 septembre 2008 - 28 avril 2006 à 15:08
Salut à tous.

Encore une fois de plus parmis vous. Voilà j'ai une application cliente/server, et quand j'envoie une requette au serveur le temps de traitements peux aller jusqu'à 10, 15 secondes, alors pour aviser l'usager par un message que le traitement de la requette est en cours je veux affciher un formulaire(popup).
Je ne peux pas faire de showmodal directement de mon formulaire(frmPatienter) car cela bloquera le traiment car je me trouve dans le meme process que celui de l envoie de la requete au serveur. Alors je me suis créé mon frmPatienter dans un autre process:

............................

ThreadStart monThread =
new ThreadStart(ThreadPatienter);

Thread thread =
new Thread(monThread );

thread.Start();

.................
/////////////////

public
static
void ThreadPatienter()

{

if (myWaitList.Count==0)

{

frmPatienter maFrmPatienter =
new frmPatienter ();

maFrmPatienter .ShowDialog();

}

Cette section marche bien, le seul problème est que mon formulaire maFrmPatienter étant d'une dimmension plus petite que le formulaire parent , l usager peut faire un clic sur les bouttons du formulaire parent et je veux éviter cela. Je ne sais s 'il ya un moyen de donner le focus à maFrmPatienter(genre sur la fenêtre windows au complet) de telle sorte que l'usager ne soit pas en mesure de jouer sur le formulaire parent(il peut cliquer sur les bouttons mais que l'evenement ne soit pas pris en compte) ou de selectioner une autre application en veille tant et aussi longtemps que le formulaire maFrmPatienter, ne soit pas fermer.

Groso modo je veux me créer un popup Patienter qui empeche tout clique le formulaire parent, dont ce dernier sera créé dans un thread.

Je vous remercie d'avance.
Au plaisir.



BobAlex

6 réponses

Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
26 avril 2006 à 10:20
Tu pourrais appeler la méthode Hide() sur ton formulaire parent avant d'appeler ton "pop up" (ca va cacher ton formulaire), puis appeler la méthode Show() lorsque tu veux afficher a nouveau ton formulaire parent.

Une autre facon de faire, c'est de mettre la propriétés Enabled de ton formulaire parent a false - ce qui désactivera tous les controles du formulaire. Ensuite tu remet a true lorsque tu veux rendre ton formulaire réutilisable.

Cela dit, ce que moi je te proposerai plutot, c'est "d'inverser" ta solution : tu lance ta requete dans un autre thread - et ton formulaire patiente (avec un showdialog).
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
26 avril 2006 à 19:18
Salut, pourquoi c'est pas la requête que tu executes dans un autre thread et utiliser une forme modale dans le thread courant ?
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
27 avril 2006 à 10:15
1 - parce que c'est plus logique : "je lance un traitement en fond et j'attend que ca se finisse" = je lance une requete dans un thread et j'attend qu'il ai finit

2 - parce que en lancant le traitement dans ton ihm (dans le thread de ton ihm pour etre précis), tu bloque completement ton IHM - ce qu'il faut eviter au maximum (pour améliorer la fameuse "user experience"). Dans ton cas ca ne change pas grand chose, car tu décide de "bloquer" ton application tant que le traitement n'est pas finis. Par contre si tu avais des animations par exemple, ca "freezerai" tout, tandis qu'en lancant ta requete dans un autre thread, le thread "ihm" est libre pour afficher ce qu'il y a a afficher pendant ce temps (une progress bar ?)

3 - Toujours par rapport au paragraphe précédent, il est préférable de ne pas bloquer l'ihm même pendant l'execution d'une requete (bien sur ce n'est pas toujours le cas). Au contraire, on lance le traitement en tache de fond, et on préviens l'utilisateur lorsque "c'est pret". Un exemple, les mises à jours des logiciels : avant, tu avais la possibilité de vérifier si ton logiciel était a jour (dans certains logiciel...) et si ce n'étais pas le cas, on te proposais un téléchargement : une fenetre de téléchargement s'ouvrait en te montrant la progression... et tu ne pouvais rien faire en attendant. Maintenant, les logiciel récents font la même chose... mais télécharge la mise à jour en background. Tu peux continuer a utiliser l'appli pendant ce temps, puis un joli popup viens te prévenir qu'une mise à jour est prête...
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
28 avril 2006 à 02:13
Euh..c'est pas moi qui est posé la question.

Tu as mal compris Nikoui, ma réponse était destinée à AlexBob et c'est la même que toi je lui proposait d'utiliser un second thread pour sa requête !!
0

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

Posez votre question
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
28 avril 2006 à 10:20
Ah oui effectivement :) Bah c'est pas grave j'aime bien raconter ma vie !
0
AlexBob789 Messages postés 8 Date d'inscription mardi 2 mars 2004 Statut Membre Dernière intervention 14 septembre 2008
28 avril 2006 à 15:08
Merci à vous pour vos interventions. Mais bon je suis rendu a 95% de la programmation de mon application et essayer de lancer l'envoie de donnée au serveur dans un autre thread sera de la grosse cuisine pour moi(car je ne suis pas très famillié avec les threads et je suis pris par le temps), alors ce que je compte faire c'est de lancer mon formulaire qui dira"Veuillez patienter" et de trouver un API qui permettra de donner le focus a mon formulaire maFrmPatienter pour eviter que l'evenement des bouttons au clic sur le formulaire principale soit pris en considération, et même enpecher l'accès du taskbar . Selon votre expérience est ce que la fonction SetWindowsPos peut me permettre de resoudre le problème.

J'ai mis false à la proprité enabled du formualire principale, mais cela ne marche pas, car c'est comme apres avoir reçus la reponse du serveur, il tient compte de l'évement généré lors du click sur le boutton qd le formulaire était enabled = false. Même problème quand j'essaie de le faire sur les boutton mettre enabled à false.






BobAlex
0
Rejoignez-nous