2010-12-22 109 views
2

我有一个窗体窗体应用程序,将打开其他窗体,但只会显示窗体几秒(用户可配置)。我通常会做类似threading.thread.sleep(n)的事情,但是当做这些时,表单控件不会只加载白色背景节目,而且我也一直在阅读,这不是我作为用户后的最佳实践在线程唤醒之前,输入将不会被执行。10秒后关闭窗体

我遇到过使用System.Timers.Timer(n)的人,但我很努力地为我工作,表单只会立即打开和关闭(您只能看到Flash形式打开然后关闭)。

,我使用的代码是:

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

aForm.Close() 

这是所有包含在传递形式和定义的运行时间私有子内。

我的意图是让主应用程序从任务栏运行,然后调用其中一个将在指定时间段内显示的窗体,关闭窗体,然后再调用其中一个窗体。

是否有任何能够指出我正确的方向为什么表单打开,然后关闭而没有看到通过定义的运行时间(我已经测试了10秒),还是有更好的方式做我正在寻找?

非常感谢您的帮助。

马特

回答

7

文档说,有一个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 

当然这个代码工作你需要设置形式与按钮。

1

只需在表格上粘贴一个时间组件并启用它。在tick事件处理程序中,确定自从表单打开多长时间并且如果预期的时间段已过,请关闭表单。

通过在等待Tick事件时允许Form_Load句柄返回,表单允许绘制并执行其他所有操作。

尽管您可以在代码中创建时间,但我不确定为什么。而且你肯定需要为Tick事件设置一个处理程序,它可以做任何好事。

+0

你能否提供关于如何确定,因为形式被打开的时间(毫秒)的例子或链接?我曾试图在WWW上寻找,但目前为止还没有取得太大的成功。 – Lima 2010-12-22 07:41:19

+0

我现在不在我的开发机器上。但只需创建一个DateTime类型的表单变量并将其设置为您的Form的Load事件处理程序中的DateTime.Now。然后,在Tick事件处理程序中,只需计算它已经过了多长时间。准确地说,毫无疑问你会遇到麻烦,但你应该能够足够接近。 – 2010-12-22 14:37:21

2

您的代码设置了一个计时器,然后立即关闭窗体。关闭必须在定时器事件触发时完成。

1

我想我可以在乔纳森的回答一下。

在希望显示给定时间的窗体上添加一个定时器(在本例中,定时器名为Timer1 ...定时器可在toolbax中找到,只需将其拖到窗体上)

具有以下形式接近它已经显示给定的时间量后开始计时形式的onload方法:

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 

我希望这可以帮助,让我知道,如果我能在一个更明确的方式重申任何:-)

0

打开窗体设定时间的真正简单的方法(在这个例子中)如果frmTemperatureStatus关闭,将跳过计时器。我将frmTemperatureStatus作为普通形式打开,而不是作为对话框,否则代码会跳转到此表单,直到表单关闭才会返回。 DoEvents保持frmTemperatureStatus响应(注意:如果您逐行测试代码,焦点一直返回到Visual Studio),frmTemperatureStatus将继续失去焦点。

  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") 
0
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