Question

J'ai une application sous forme de fenêtres qui ouvrira d'autres formes, mais affiche uniquement les formes pendant quelques secondes (configurable par l'utilisateur). Je normalement faire quelque chose comme threading.thread.sleep (n), mais lorsque vous faites cela, les formes de contrôle ne se charge pas seulement les émissions de fond blanc, et je l'ai aussi lu que ce ne est pas la meilleure pratique pour ce que je suis après que l'utilisateur entrée ne seront pas traitées jusqu'à ce que le fil se réveille.

Je suis venu à travers les personnes qui utilisent System.Timers.Timer (n), mais je me bats pour obtenir ce travail pour moi, la forme ne ouvrir et fermer tout de suite (vous ne pouvez voir un flash comme la forme ouvre puis ferme).

Le code que j'utilise est:

Private Shared tmr As New System.Timers.Timer    
aForm.Show()
tmr = New System.Timers.Timer(aSleep * 60 * 60)
tmr.Enabled = True

aForm.Close()

Tout cela est contenu dans un sous privé qui passe la forme et la durée de fonctionnement défini.

Mon intention est d'avoir la principale application en cours d'exécution de la barre des tâches, qui appelle ensuite l'une des formes qui affiche pour une période de temps définie, fermez le formulaire, puis appeler un autre des formes.

est une mesure de me diriger dans la bonne direction pour pourquoi la forme ouvre puis ferme sans voir à travers le temps d'exécution défini (j'ai testé avec 10 secondes), ou est-il une meilleure façon de faire ce que je cherche?

Votre aide est grandement appréciée.

Matt

Était-ce utile?

La solution

les docs disent qu'il ya un gestionnaire d'événements qui est appelé Elapsed lorsque le temps est écoulé de. Vous fermez le formulaire dans le gestionnaire:

http: // msdn. microsoft.com/en-us/library/system.timers.timer%28VS.85%29.aspx

Je viens d'écrire un petit exemple qui montre ce que vous devez faire à:

http://www.antiyes.com/close-form-after- 10 secondes

Voici le code correspondant, la solution complète peut être téléchargée à partir de l'article.

Formulaire 1 code

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim frm2 As New Form2()
        frm2.ShowDialog()
    End Sub

End Class

Code formulaire 2

Imports System.Timers

Public Class Form2

    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        MyBase.OnLoad(e)
        Dim tmr As New System.Timers.Timer()
        tmr.Interval = 5000
        tmr.Enabled = True
        tmr.Start()
        AddHandler tmr.Elapsed, AddressOf OnTimedEvent
    End Sub

    Private Delegate Sub CloseFormCallback()

    Private Sub CloseForm()
        If InvokeRequired Then
            Dim d As New CloseFormCallback(AddressOf CloseForm)
            Invoke(d, Nothing)
        Else
            Close()
        End If
    End Sub

    Private Sub OnTimedEvent(ByVal sender As Object, ByVal e As ElapsedEventArgs)
        CloseForm()
    End Sub

End Class

Bien sûr, pour ce code fonctionne, vous auriez besoin d'une configuration de formulaires avec les boutons.

Autres conseils

Votre code définit une minuterie puis ferme immédiatement la forme. La fermeture doit être fait lorsque l'événement se déclenche la minuterie.

Je pense que je peux développer la réponse un peu de Jonathan.

Sur la forme que vous souhaitez afficher pour une quantité donnée de temps, ajouter une minuterie (dans cet exemple, la minuterie est nommé Timer1 ... Timers se trouvent dans le toolbax, juste faites-le glisser sur le formulaire)

Pour avoir la forme étroite après avoir été affiché pendant un certain laps de temps démarrer la minuterie dans la méthode onload du formulaire:

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    'Do initialization stuff for your form...
    'Start your timer last.
    Timer1.Start()
End Sub

Cela va démarrer votre minuterie. Lorsque le temps est écoulé de présélection, l'événement tique se déclenche. Dans ce lieu de l'événement de votre code de fermeture de formulaire:

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    'Close the form after 1 tick.
    Me.Close()
End Sub

Pour changer combien de temps devrait s'écouler avant que les tiques de la minuterie, modifiez la propriété intervalle de minuterie.

'Changing the time from outside the Form1 class...
Form2.Timer1.Interval = 2000 '2 seconds, the interval is in milliseconds.

code complet, form1 a un bouton qui définit le intervalle de minuterie et ouvre alors form2.

Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Form2.Timer1.Interval = 2000
        Form2.Show()
    End Sub
End Class


Public Class Form2
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Do initialization stuff for your form...
        'Start your timer last.
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Me.Close()
    End Sub
End Class

J'espère que cette aide, laissez-moi savoir si je peux répéter quoi que ce soit d'une façon plus claire: -)

Il suffit de coller un composant de temps sur la forme et l'activer. Dans le gestionnaire d'événements tick, déterminer depuis combien de temps la forme ouverte et si la période prévue a, fermez le soit écoulé sous forme.

En permettant à la poignée de Form_Load revenir pendant que vous attendez pour l'événement Tick, la forme est autorisé à peindre et faire tout le reste il le ferait normalement.

Alors que vous pouvez créer le temps à partir du code que vous faites, je ne sais pas pourquoi vous. Et vous avez certainement besoin de définir un gestionnaire pour l'événement Cochez pour lui faire du bien.

Une façon simple réelle d'ouvrir un formulaire pour un temps de jeu (et dans cet exemple) sautera minuterie si frmTemperatureStatus est fermé. J'ouvre frmTemperatureStatus comme une forme normale non pas comme une boîte de dialogue sinon le code passe à ce formulaire et ne retourne pas jusqu'à ce que le formulaire est fermé. Les DoEvents maintient frmTemperatureStatus réactif (Note: frmTemperatureStatus gardera perdre le focus si vous ligne de code de test en ligne comme mise au point continue de retourner à Visual Studio).

            timeIncubation_End_Time = Now.AddMinutes(1)
            Me.Enabled = False
            frmTemperature_Status.Show()

            Do While frmTemperature_Status.Visible And timeIncubation_End_Time > Now
                Application.DoEvents()
                Threading.Thread.Sleep(100)
            Loop
            frmTemperature_Status.Close() ' This line doesn't cause an error if the form is already closed
            Me.Enabled = True
            MsgBox("End of dialog test")
Public Class Form1
    Dim second As Integer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1.Interval = 1000
        Timer1.Start() 'Timer starts functioning
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Label1.Text = DateTime.Now.ToString

        second = second + 1
        If second >= 10 Then
            Timer1.Stop() 'Timer stops functioning
            Me.Close()
            MsgBox("Timer Stopped....")
        End If

    End Sub

End Class
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top