Закрыть форму через 10 секунд - PullRequest
2 голосов
/ 22 декабря 2010

У меня есть приложение Windows Form, которое открывает другие формы, но отображает формы только в течение нескольких секунд (настраивается пользователем). Я обычно делал бы что-то вроде threading.thread.sleep (n), однако при этом элементы управления форм не загружают только белые фоновые изображения, и я также читал, что это не лучшая практика для того, что я представляю как пользователь вход не будет действовать, пока поток не проснется.

Я сталкивался с людьми, использующими System.Timers.Timer (n), но я изо всех сил стараюсь, чтобы это работало на меня, форма будет открываться и закрываться сразу (вы можете видеть только вспышку, когда форма открывается затем закрывается).

Код, который я использую:

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

aForm.Close()

Это все содержится в Private sub, который передает форму и определенное время выполнения.

Мое намерение состоит в том, чтобы главное приложение работало с панели задач, которое затем вызывает одну из форм, которые будут отображаться в течение определенного периода времени, закрывает форму, а затем вызывает другую форму.

Может ли кто-нибудь указать мне правильное направление, почему форма открывается, а затем закрывается, не видя в течение определенного времени выполнения (я тестировал с 10 секундами), или есть лучший способ сделать то, что я ищу?

Ваша помощь очень ценится.

Мэтт

Ответы [ 6 ]

7 голосов
/ 22 декабря 2010

в документах говорится, что есть обработчик события Elapsed, который вызывается по истечении времени. Вы бы закрыли форму в обработчике:

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

Я только что написал небольшой пример, который показывает, что вам нужно сделать по адресу:

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

Ниже приведен соответствующий код, полное решение можно скачать из статьи.

Код формы 1

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

Форма 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

Конечно, чтобы этот код работал, вам нужно настроить формы с помощью кнопок.

2 голосов
/ 23 декабря 2010

Я думаю, что могу немного расширить ответ Джонатана.

В форме, которую вы хотите отобразить в течение заданного промежутка времени, добавьте таймер (в этом примере таймер называется Timer1 ... Таймеры можно найти в инструментальной панели, просто перетащите его на форму)

Чтобы закрыть форму после ее отображения в течение заданного промежутка времени, запустите таймер в методе загрузки формы:

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
    'Close the form after 1 tick.
    Me.Close()
End Sub

Чтобы изменить количество времени, которое должно пройти до того, как отметится таймер, измените свойство интервала таймера.

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

Полный код, form1 имеет кнопку, которая устанавливает интервал таймера, а затем открывает форму 2.

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

Надеюсь, это поможет, дайте мне знать, если я смогу переформулировать что-нибудь более понятным образом: -)

2 голосов
/ 22 декабря 2010

Ваш код устанавливает таймер, а затем немедленно закрывает форму. Закрытие должно быть сделано при срабатывании события таймера.

1 голос
/ 22 декабря 2010

Просто добавьте компонент времени в форму и включите его. В обработчике тиковых событий определите, сколько времени прошло с момента открытия формы, и если запланированный период истек, закройте форму.

Позволяя дескриптору Form_Load возвращаться, пока вы ожидаете события Tick, форма может рисовать и делать все остальное, как обычно.

Хотя вы можете создавать время из кода, как вы делаете, я не уверен, почему вы это сделали. И вам определенно нужно установить обработчик для события Tick, чтобы он приносил пользу.

0 голосов
/ 27 октября 2017
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
0 голосов
/ 03 января 2014

Реально простой способ открытия формы в течение заданного времени (и в этом примере) пропустит таймер, если frmTemperaStatus закрыт. Я открываю frmTemperaStatus как обычную форму, а не как диалог, в противном случае код переходит на эту форму и не возвращается, пока форма не закроется. DoEvents поддерживает отзывчивость frmTemperaStatus (примечание: frmTemperaStatus будет терять фокус, если вы построчно тестируете код, поскольку фокус продолжает возвращаться в 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")
...