Bonjour,
Il m'a été demandé de faire un winform d'attente sur le compact framework 3.5.
En fait j'ai un terminal mobile (d'où le Compact Framework) qui envoie des message via TCP. J'avais géré les cas ou la communication ne fonctionnait pas.
Mais ce qu'il peut arriver c'est que la communication fonctionne mais que le serveur plante, ou lève une exception pendant le traitement de la demande et s'arrète.
Cela fait que le terminal attend une réponse à sa demande qu'il n'aura jamais.
Vu que j'empêche le terminal d'envoyer la même demande plusieurs fois d'affilé, en rendant indisponible le bouton. Si c'est le serveur qui merde, l'application du terminal ne peut plus avancer.
Voila en gros le principe:
Je clic sur "nouvel identifiant"
Je met enable=false sur le bouton
Le terminal envoie la demande au serveur
Le serveur recoit la demande
Le serveur fait un create dans la base
Le serveur récupère l'ID
Le serveur renvoie l'ID au terminal qui lui a demandé
Le terminal recoit le nouvel ID
Maintenant si la phase d'acces à la base foire, je ne peux pas renvoyer de demande d'identifiant au serveur. Et le terminal ne sait pas du tout ce qu'il se passe.
On m'a donc demandé de faire une winform avec un Gif de préférence, et un unique bouton permettant "d'annuler" la demande. Et de remettre l'application dans l'état dans lequel elle se trouvait avant la demande.
Donc je me dis qu'il faut que je fasse une winform qui lance un thread lorsqu'elle s'affiche. J'aurais au préalable instancié un délegate qui "pointera" sur la méthode d'envoi souhaité (demande d'id, annulation....).
Et lorsque je clic sur le bouton "annuler" je kill le thread.
Mais je ne sais pas si c'est une bonne technique, ni comment la mettre en place. Je connais le principe des threads et des delegates, mais j'ai du mal à le mettre en place.
voila ce que j'ai essayé, mais la fenêtre ne s'affiche pas correctement.
avec _emetteur.DemandeNewIDReception qui est le delegate pointant sur la méthode demandé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 public void DemandeNewIDReception() { this._frmReception.TopMost=false; FrmWaiter waiter = new FrmWaiter(_emetteur.DemandeNewIDReception); waiter.ShowDialog();
Merci de vos conseils avisés.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 public partial class FrmWaiter : Form { private Thread _thread; //MethodeDemande étant un delegate. Signatire void MethodeDemande() private MethodeDemande _demande; private bool _stopThread = false; public FrmWaiter(MethodeDemande demande) { InitializeComponent(); _demande = demande; _thread = new Thread(new ThreadStart(DemarreThread)); } public void button1_Click(object sender, EventArgs e) { this._stopThread=true; } private void DemarreThread() { _demande.Invoke(); while (!this._stopThread) { continue; } } private void FrmWaiter_Activated(object sender, EventArgs e) { _thread.Start(); _thread.Join(); } } }
Partager