Fermer sur un Thread principal une fenêtre ouverte (form) sur un autre thread (Timer)
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:
Code:
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 |
Deuxième essai après le premier essai qui ne permet pas la fermeture de la fenêtre d'information ProxyTest en essayant de
déléguer la fermeture :
Code:
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 |
Et enfin, le dernier essai qui semble fonctionner parfaitement ? :
Code:
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 |
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.
Merci d'avance pour votre aide !