Bonjour,
J'ai fait plusieurs essais pour fermer une fenêtre d'information d'attente d'un thread principal qui est lancé au démarrage d'une instance.
La fenêtre d'information d'attente est ouverte avec l'événement System.Timers.Elapsed.
J'ai donc utilisé un Timer pour différer l'ouverture du message d'attente au cas ou le serveur est "busy".
Mais cette fenêtre ne peut plus être fermée avec un simple Form.Close(). La commande est bien parcourue au débogage mais
celle-ci refuse de se fermer.
Ok, j'ai lu que le Timer s’exécute sur un autre Thread donc comme c'est "Cloisonné" pas d'issue possible.
J'ai essayé ensuite d'utiliser la méthode Invoke avec Delegate mais je ne suis pas du tout satisfait du résultat car avec la récursivité du Sub, la fenêtre "mouline" et se ferme enfin quand même au bout de 20 à 30 s : cela fait un peu tâche !
J'ai de nouveau essayé avec le lancement de la commande Application.Run(New Form). La fenêtre d'attente s'ouvre bien à
l'aide du Timer. Et Surprise, lorsque je lance la commande Application.Exit() : je reste sur le Thread principal, la fenêtre
se ferme tout de suite et tout fonctionne bien mais je ne sais pas plus pourquoi et si la méthode est "propre" ?
Premier code avec la fenêtre qui ne se ferme pas du tout (Je n'ai pas mis de code pour la "form" Proxytest car elle ne
fait qu'afficher un bandeau et du texte dans un label pour l'attente:
Deuxième essai après le premier essai qui ne permet pas la fermeture de la fenêtre d'information ProxyTest en essayant de
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 Imports System.Timers Module Routine Private Temps As Timer Private ProxTim as boolean Public Function IntProx() As Boolean Dim adrtest As String = "http://www.example.com" Try prox = WebRequest.GetSystemWebProxy() AdrProxy = prox.GetProxy(New Uri(adrtest)) proxyObject = New WebProxy(AdrProxy, True) proxyObject.UseDefaultCredentials = True request = WebRequest.Create(adrtest) request.Timeout = 60000 request.Proxy = proxyObject ProxTim= True Temps = New Timer() Temps.Interval = 1500 Temps.Enabled = True Temps.Start() AddHandler Temps.Elapsed, AddressOf OnTimedEvent ReponseReq = CType(request.GetResponse, HttpWebResponse) If ReponseReq.StatusCode = HttpStatusCode.OK Then Temps.Enabled = False Temps.Dispose() Return False End If Catch ex As WebException If CType(ex.Response, HttpWebResponse).StatusCode = HttpStatusCode.ProxyAuthenticationRequired Then temps2.Enabled = False : temps2.Dispose() Return True End If Finally If Not ProxTim Then Proxytest.close() End Try End Function Public Sub OnTimedEvent(source As Object, e As System.Timers.ElapsedEventArgs) If ProxTim Then ProxTim =False Temps.Stop() ProxyTest.Show() ProxyTest.Refresh() End If End Sub End Module Public Class ProxyTest ' Il n'y a pas de code utilisateur dans la classe ce n'est que de l'affichage de textes" End Class
déléguer la fermeture :
Et enfin, le dernier essai qui semble fonctionner parfaitement ? :
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 Imports System.Timers Module Routine Private Temps As Timer Private ProxTim as boolean Public Function IntProx() As Boolean Dim adrtest As String = "http://www.example.com" Try prox = WebRequest.GetSystemWebProxy() AdrProxy = prox.GetProxy(New Uri(adrtest)) proxyObject = New WebProxy(AdrProxy, True) proxyObject.UseDefaultCredentials = True request = WebRequest.Create(adrtest) request.Timeout = 60000 request.Proxy = proxyObject ProxTim= True Temps = New Timer() Temps.Interval = 1500 Temps.Enabled = True Temps.Start() AddHandler Temps.Elapsed, AddressOf OnTimedEvent ReponseReq = CType(request.GetResponse, HttpWebResponse) If ReponseReq.StatusCode = HttpStatusCode.OK Then Temps.Enabled = False Temps.Dispose() Return False End If Catch ex As WebException If CType(ex.Response, HttpWebResponse).StatusCode = HttpStatusCode.ProxyAuthenticationRequired Then temps2.Enabled = False : temps2.Dispose() Return True End If Finally If Not ProxTim Then Proxytest.CloseForm() End Try End Function Public Sub OnTimedEvent(source As Object, e As System.Timers.ElapsedEventArgs) If ProxTim Then ProxTim =False Temps.Stop() ProxyTest.Show() ProxyTest.Refresh() End If End Sub End Module Public Class ProxyTest Private Delegate Sub Clsfrm() Public Sub CloseForm() If Me.InvokeRequired Then Me.Invoke(New Clsfrm(AddressOf CloseForm), New Object() {}) Else Me.Close() End If End Sub End Class
Désolé pour mon message un peu long avec les trois "codes" mais je voulais mettre les trois variantes pour être le plus clair possible.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 Imports System.Timers Module Routine Private Temps As Timer Private ProxTim as boolean Public Function IntProx() As Boolean Dim adrtestAs String = "http://www.example.com" Try prox = WebRequest.GetSystemWebProxy() AdrProxy = prox.GetProxy(New Uri(adrtest)) proxyObject = New WebProxy(AdrProxy, True) proxyObject.UseDefaultCredentials = True request = WebRequest.Create(adrtest) request.Timeout = 60000 request.Proxy = proxyObject ProxTim= True Temps = New Timer() Temps.Interval = 1500 Temps.Enabled = True Temps.Start() AddHandler Temps.Elapsed, AddressOf OnTimedEvent ReponseReq = CType(request.GetResponse, HttpWebResponse) If ReponseReq.StatusCode = HttpStatusCode.OK Then Temps.Enabled = False Temps.Dispose() Return False End If Catch ex As WebException If CType(ex.Response, HttpWebResponse).StatusCode = HttpStatusCode.ProxyAuthenticationRequired Then temps2.Enabled = False : temps2.Dispose() Return True End If Finally If Not ProxTim Then Application.Exit() End Try End Function Public Sub OnTimedEvent(source As Object, e As System.Timers.ElapsedEventArgs) If ProxTim Then ProxTim =False Temps.Stop() Application.Run(New ProxyTest) End If End Sub End Module Public Class ProxyTest End Class
Merci d'avance pour votre aide !
Partager