教程中国
PHOTOSHOP CS9.0中文版 MAYA 8.5 FOR WINDOWS Corel Painter v9.0 Flash MX2004 中文版 Illustrator cs2 中文版
VC++6.0含sp6 中英文版 VB6.0 +sp6 简体中文版 Borland Delphi 7汉化版 MSDN for vb6.0中文版 Visual Studio 2005简体
教程中国下属 文件存储共享专家BIBIDU.COM 提供大型软件,教材,源码,电影,音乐,图书等下载 更多精品请点此进入
  您目前所在位置: 教程中国 >> .NET类 >> VB.NET >> Visual Basic .NET实现后台处理(4) RSS订阅
Visual Basic .NET实现后台处理(4)
教程(视频,书籍)下载:  ASP.NET AutoCAD 数据库 C# ASP java photoshop 网页设计 delphi 3dmax Flash C++ VB 张孝祥 实例   更多请进入BIBIDU搜索
IT搜索引擎   
典型情况下这些并不麻烦。其结果是Invoke方法触发一个进程,通过该进程窗体终止在自己的UI线程上运行的方法,这正是我们的设计目标。

  同样这些代码写入一个区域(Region),可以使它们在worker线程中被调用时比较清晰。

#Region " Code called from the worker thread "

'从worker线程调用来更新显示

'它用状态信息触发了一个向UI的方法调用

'该调用在UI线程上作出

Private Sub Display(ByVal Text As String) _

Implements IController.Display

Dim disp As New DisplayDelegate( _

AddressOf CType(mClient, IClient).Display)

Dim ar() As Object = {Text}

'调用UI线程的客户窗体来更新显示

mClient.BeginInvoke(disp, ar)

End Sub

'从worker线程调用用于显示失败。

'它用exception对象触发了一个向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

'从worker线程调用来表明完成百分比

'该值进入Controller,如果需要能在那儿被UI读取

Private Sub SetPercent(ByVal Percent As Integer) _

Implements IController.SetPercent

mPercent = Percent

End Sub

'从worker线程调用来显示已经完成

'传递了一个参数用于显示真的完成了和者"取消"了

'该调用在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

'显示是否仍在运行或者有"取消"请求

'该调用在worker线程上作出,这样worker代码可以看是否应该温和地退出

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&&事件,接着我们声明了一个类型对象数组存放传递给该方法的参数值,最后调用客户窗体的Invoke方法,传递委托&&keyword=%D6%B8%D5%EB&Submit=+%CB%D1%CB%F7+">指针和参数数组给窗体。

  随后窗体在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,可以拖拉边界或在&&属性窗口中设定Size值来实现。

  其它的在代码中实现。为了建立一系列动态闪烁的"亮点",我们将Timer控件与一组PictureBox控件一起使用。每次Timer控件到期,我们将下一个PictureBox设为绿色,将已经是绿色的变成窗体色。

  放置Timer控件,将它的名字改为tmAnim,Interval&&属性设为300。

  另外,在Components页上有一个不同的Timer控件。这是个多线程时钟。换句话说,它在后台线程上建立Elapsed&&事件,不同于UI线程上的Windows窗体时钟。在建立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

For index = 0 To 6

mBoxes.Add(CreateBox(index))

Next

End If

mCount = 0

End Sub

Private Function CreateBox(ByVal index As Integer) As PictureBox

Dim box As New PictureBox()

With box

SetPosition(box, index)

.BorderStyle = BorderStyle.Fixed3D

.Parent = Me

.Visible = True

End With

Return box

End Function

Private Sub GrayDisplay()

Dim index As Integer

For index = 0 To 6

CType(mBoxes(index), PictureBox).BackColor = Me.BackColor

Next

End Sub

Private Sub SetPosition(ByVal Box As PictureBox, ByVal Index As Integer)

Dim left As Integer = CInt(Me.Width / 2 - 7 * 14 / 2)

Dim top As Integer = CInt(Me.Height / 2 - 5)

With Box

.Height = 10

.Width = 10

.Top = top

.Left = left + Index * 14

End With

End Sub

Private Sub tmAnim_Tick(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles tmAnim.Tick

CType(mBoxes((mCount + 1) Mod 7), PictureBox).BackColor = _

Color.LightGreen

CType(mBoxes(mCount Mod 7), PictureBox).BackColor = Me.BackColor

mCount += 1

If mCount > 6 Then mCount = 0

End Sub

Public Sub Start()

CType(mBoxes(0), PictureBox).BackColor = Color.LightGreen

tmAnim.Enabled = True

End Sub

Public Sub [Stop]()

tmAnim.Enabled = False

GrayDisplay()

End Sub

Private Sub ActivityBar_Resize(ByVal sender As Object, _

ByVal e As System.EventArgs) Handles MyBase.Resize

Dim index As Integer

For index = 0 To mBoxes.Count - 1

SetPosition(CType(mBoxes(index), PictureBox), index)

Next

End Sub

  窗体的Load&&事件建立PictureBox控件并把它们放入一个数组,这样容易循环。Timer控件的Tick&&事件按次序循环使每个点变为绿色。

  这些都由Start&&事件启动,由Stop&&事件停止。由于Stop是保留字,该方法的名称加上了方括号:[Stop]。Stop方法不仅停止定时器,而且使所有的方框变为灰色以显示没有当前活动。

来源:十度教育
作者:
关键字:Visual,Basic
发表日期:2006-5-15 13:12:08

网页显示有限 阅读全文请下载本文完整版WORD文档

上一篇:Visual Basic .NET实现后台处理(3)   下一篇:Visual Basic .NET实现后台处理(5)


2008-10-8 15:14:02
本文的相类似文章
  • Visual Basic_美化你的文字
  • Visual Basic 6中发送邮件的新方法
  • Visual Basic 中字符淡出淡入的实现
  • 想不到的VB指针用法{Visual Basic6.0}
  • Visual C#的SQL Server编程
  • 建立你自己的浏览器-发送到Visual Interdev
  • Visual Basic小游戏:猜英雄
  • Visual Basic的九次蜕变
  • Visual Basic内嵌汇编语言解决方案
  • Visual Basic不可能消失
  • 在学习中进步 在进步中成长 教程中国相随您的成长之路
    华腾联合科技股份有限公司版权所有
    广告联系:Rosibo@163.com