资源大全 | 神秘文化 | 在线翻译 | QQ专区 | 视频教程 | 彩信频道 | 搜索引擎 | BT下载 |  | 网站地图
设为首页
加入收藏
联系站长
您现在的位置: 一百网络 >> 其他编程 >> VB编程 >> 文档正文
最近更新
普通文档 在 Visual Basic .NET 中
普通文档 在 Visual Basic .NET 中
普通文档 在 Visual Basic .NET 中
普通文档 定时提醒你休息的脚本
普通文档 用VB备份和恢复SQL Serv
普通文档 利用Visual Basic开发SA
普通文档 用DirectShow实现QQ的音
普通文档 Visual Basic数据库操作
普通文档 在VB中存取数据库中的图
普通文档 VB实现图像在数据库的存
推荐文章
  • 此栏目下没有推荐文档
  • 在 Visual Basic .NET 中实现后台进程(三)

    文章作者:未知 录入时间:2006-10-7 来源:本站原创
    网站声明:本站的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出处和原始作者,文章版权归本网站与文章作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。


    创建显示的窗体

    最后,我们可以创建窗体,将其用于启动或取消后台进程。该窗体还将显示活动和状态信息。

    打开 Form1 的设计器并添加两个按钮(btnStartbtnRequestCancel)、两个标签(Label1Label2)、一个 ProgressBar (ProgressBar1) 和一个 ActivityBar (ActivityBar1),如图 7 所示。

    该窗体需要实现 IClient,以便 Controller 对象与之交互:

    Imports Background
    
    Public Class Form1
      Inherits System.Windows.Forms.Form
    
      Implements IClient
    

    该窗体还需要 Controller 对象和一个标志,用以跟踪后台操作是处于活动状态还是处于完成状态。

      Private mController As New Controller(Me)
      Private mActive As Boolean
    

    然后,我们可以添加方法,以实现由 IClient 定义的接口。建议将这些方法放在 Region 中,以表示它们实现的是辅助接口:

    #Region " IClient "
    
      Private Sub TaskStarted(ByVal Controller As Controller) _
          Implements IClient.Start
    
        mActive = True
        Label1.Text = "Starting"
        Label2.Text = "0%"
        ProgressBar1.Value = 0
        ActivityBar1.Start()
    
      End Sub
    
      Private Sub TaskStatus(ByVal Text As String) _
          Implements IClient.Display
    
        Label1.Text = Text
        Label2.Text = CStr(mController.Percent) & "%"
        ProgressBar1.Value = mController.Percent
    
      End Sub
    
      Private Sub TaskFailed(ByVal e As Exception) _
          Implements IClient.Failed
    
        ActivityBar1.Stop()
        Label1.Text = e.Message
        MsgBox(e.ToString)
        mActive = False
    
      End Sub
    
      Private Sub TaskCompleted(ByVal Cancelled As Boolean) _
          Implements IClient.Completed
    
        Label1.Text = "Completed"
        Label2.Text = CStr(mController.Percent) & "%"
        ProgressBar1.Value = mController.Percent
        ActivityBar1.Stop()
        mActive = False
    
      End Sub
    
    #End Region
    

    请注意,这一段代码中的所有内容均与线程无关,其中的每一部分代码都可以在我们得知后台操作的状态时做出相应的响应。每次响应后,我们都会更新显示以表明进程的状态和完成百分比(以文字的形式或通过 ProgressBar 显示),并启动和停止 ActivityBar 控件。

    mActive 标志非常重要。如果用户在辅助线程处于活动状态时关闭窗体,应用程序可能会挂起或变得不稳定。要防止出现这种情况,我们可以打断窗体的 Closing 事件并取消关闭尝试(如果后台进程处于活动状态)。

      Private Sub Form1_Closing(ByVal sender As Object, _
        ByVal e As System.ComponentModel.CancelEventArgs) _
        Handles MyBase.Closing
    
        e.Cancel = mActive
    
      End Sub
    

    我们还可以选择在这种情况下初始化取消操作,但是这取决于特定的应用程序要求。

    其余的代码都是为了实现按钮的 Click 事件。

      Private Sub btnStart_Click(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles btnStart.Click
    
        mController.Start(New Worker(2000000, 100))
    
      End Sub
    
      Private Sub btnStop_Click(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles btnStop.Click
    
        Label1.Text = "Cancelling ..."
        mController.Cancel()
    
      End Sub
    

    Start(开始)按钮只调用 Controller 对象的 Start 方法,并将 Worker 对象的实例传递给它。

    您可能需要调整用于初始化 Worker 对象的值,以便在您的计算机上获得所需的结果。这些特定的值提供了双处理器 P3/450 计算机上的一个良好示例。显然,这只是用于测试目的。真正的 Worker 对象将实现更有意义、运行时间更长的进程。

    Cancel(取消)按钮将调用 Controller 对象的 Cancel 方法,同时还会更新显示,以表明已请求取消。请记住,这只是一个取消“请求”,在辅助线程真正停止运行之前可能需要等待一些时间。最好能够为用户提供即时反馈,至少应让用户知道系统已经注意到用户的单击按钮操作。

    现在,我们可以运行应用程序了。单击 Start(开始)按钮时,Worker 就应该开始运行,而且显示的内容会在运行时更新。您可以将窗体移动到屏幕上的任意位置,也可以与其交互,因为 UI 线程本质上还处于空闲状态,可以随时与您交互。

    同时,辅助线程在后台进行大量复杂的工作,并定期将状态更新信息发送给 UI 线程以进行显示。

    小结

    多线程是一个功能强大的工具,我们可以在每次需要执行长时间运行的任务时使用该工具。我们可以用它运行辅助代码,而无需绑定用户界面。但同时要注意,多线程操作非常复杂,要正确操作并不容易,而且调试起来也比较困难。

    尽管不一定能够实现,但我们还是应该尽量为每个辅助线程提供一组它可以操作的独立数据。要达到这个目的,最简单的方法就是为每个线程创建一个对象,对象中包含该线程可以操作的数据以及完成工作所需的代码。

    通过实现结构化的架构,使之充当辅助线程和 UI 线程之间的媒介,我们可以大大简化编写多线程代码和 UI 以对其进行控制的过程。本文就介绍了这样一个架构,您可以根据需要使用或进行调整,以满足特定的应用需要。

  • 上一篇文档:

  • 下一篇文档: 没有了
  •     查找更多“在 Visual Basic .NET 中实现后台进程(三)”的内容  
    相关连接
  • 在 Visual Basic .NET 中实现后台进程(二)

  • 在 Visual Basic .NET 中实现后台进程(一)