在 Visual Basic .NET 中实现后台进程__教程 |
|
日期:2007-5-20 1:14:28 人气:359 [大 中 小] |
|
|
|
' 从辅助线程调用,以表明出现故障 ' 这将触发对包含异常对象的 UI 的 ' 方法调用 - 该调用是在 UI 线程上 ' 进行的 Private Sub Failed(ByVal e As Exception) _ Implements IController.Failed
Dim disp As New FailedDelegate(_ AddressOf CType(mClient, IClient).Failed) Dim ar() As Object = {e}
' 在 UI 线程上调用客户端窗体 ' 以表明出现故障 mClient.Invoke(disp, ar)
End Sub
' 从辅助线程上调用,以指出完成的百分比 ' 值将转到 Controller,由 UI 在需要时读取 Private Sub SetPercent(ByVal Percent As Integer) _ Implements IController.SetPercent
mPercent = Percent
End Sub
' 从辅助线程调用,以表明已完成 ' 我们还传递参数,以表明是否真正完成, ' 以及是否取消在 UI 线程上进行的对 UI ' 的调用 Private Sub Completed(ByVal Cancelled As Boolean) _ Implements IController.Completed
mRunning = False Dim comp As New CompletedDelegate( _ AddressOf CType(mClient, IClient).Completed) Dim ar() As Object = {Cancelled}
' 调用 UI 线程上的客户端窗体 ' 以表明已完成 mClient.Invoke(comp, ar)
End Sub
' 表明是否仍在运行或是否已请求取消 ' 这将在辅助线程上进行调用,因此 ' 辅助代码可以查看它是否应该正常 ' 退出 Private ReadOnly Property Running() As Boolean _ Implements IController.Running Get Return mRunning End Get End Property
#End Region
Failed 和 Completed 方法利用窗体的 Invoke 方法。例如,Failed 方法可以执行以下操作:
Dim disp As New FailedDelegate(_ AddressOf CType(mClient, IClient).Failed) Dim ar() As Object = {e}
' 调用 UI 线程上的客户端窗体 ' 以表明出现故障 mClient.Invoke(disp, ar)
首先创建一个委托,从 IClient 接口指向客户端窗体的 Failed 方法。然后声明包含向方法传递参数值的 Object 类型数组。最后调用客户端窗体的 Invoke 方法,将委托指针和参数数组传递给窗体。
窗体将在 UI 线程(窗体在这里可以安全运行以更新显示)上使用这些参数调用此方法。
整个进程是同步进行的,即对窗体进行调用时辅助线程将停止。尽管可以在显示错误消息或完成消息时停止辅助线程,但我们并不希望显示每个小状态时都停止辅助线程。
为了避免显示状态时停止辅助线程,Display 方法将使用 BeginInvoke,而不使用 Invoke。BeginInvoke 使窗体上的方法调用异步进行,这样辅助线程可以一直保持运行状态,不需要等待窗体上的显示方法完成:
Dim disp As New DisplayDelegate( _ AddressOf CType(mClient, IClient).Display) Dim ar() As Object = {Text}
' 调用 UI 线程上的客户端窗体 ' 以更新显示 mClient.BeginInvoke(disp, ar)
以这种方式使用 BeginInvoke 可以防止辅助线程停止,使辅助线程具有尽可能高的性能。
ActivityBar 控件 最后,我们来创建显示动画点的 ActivityBar 控件。
在名为 ActivityBar 的项目中添加一个用户控件。
将该控件的宽度调整为约 110,高度调整为约 20。可以通过拖动边界进行调整,也可以通过在 Properties(属性)窗口中设置 Size 属性进行调整。
其余的操作将通过代码完成。要创建一系列在显示时不停闪烁的动画“灯”,可以使用带有 Timer 控件的一系列 PictureBox 控件。每次 Timer 控件关闭时,我们将使下一个 PictureBox 呈绿色显示,并将已经呈绿色显示的 PictureBox 更改为窗体的背景色。
将 Windows Forms(Windows 窗体)选项卡中的 Timer 控件放入窗体中,然后将其名称更改为 tmAnim。同时将 Interval 属性设置为 300,以获得较好的动画速度。
顺便说一句,Components(组件)选项卡中有一个不同的 Timer 控件。它是一个多线程计时器。也就是说,该计时器将在后台线程中引发 Elapsed 事件,而不是象 Windows 窗体计时器那样在 UI 线程上引发 Elapsed 事件。建立 UI 时这种方法通常会产生相反的效果,因为 Elapsed 事件中的代码显然不能直接与我们的 UI 进行交互。
现在,在控件中添加以下代码:
Private mBoxes As New ArrayList() Private mCount As Integer
Private Sub ActivityBar_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load
Dim index As Integer
If mBoxes.Count = 0 Then |
|
出处:本站原创 作者:佚名 |
|
|