初涉VB.Net多线程

作者在 2012-02-15 15:13:33 发布以下内容

  最近要写一个网络通讯方面的程序,通过网上查找,发现无一例外地都使用了多线程;我以前总用VB写程序,从没涉足过多线程,说实话,连多线程的概念都是模糊的,它和进程是什么关系?和过程、函数有什么区别?诸如此类的问题我一概说不清楚。还等什么,赶快上网找资料吧。

  我们知道,Windows系统是一个多任务系统,多任务的特点就是在操作系统的协调下多个完成不同功能的程序可以同时运行在电脑中而互不干扰,比如我们在浏览网页时可以同时听歌、看电影、聊天,这些同时运行在电脑中的程序称为进程,Windows系统通过进程ID来分时间片来管理各进程;而一个进程包含一个或多个线程,也就是一个进程必须包含一个线程,线程是进程中可以独立运行的程序片段,也就是说,主程序在运行时,主程序可以启动一个线程,线程可以和主程序同时运行;线程是系统中分时处理的最小单位,线程有自己独立的栈处理数据,它在和主程序同时运行时可以共享主程序定义的变量、函数。

  这样就有点概念了,其实,线程就是程序中的一个子程序,所不同的是当该子程序以线程的方式运行时,会在系统的多任务下做个登记,这样系统在运行主程序的同时将根据该线程的登记号同时运行该子程序,比如,假如主程序的登记号为99,当该主程序启动一个线程时,线程的登记号为100,此时系统将把分时的时间片段分成100片,到99片时,电脑是被主程序控制着,而到第100片时,电脑的控制权就交给了该主程序启动的这个线程,由于时间片段很短(小于0.1秒),我们总体上觉得它们是同时运行的;线程和子程序的不同之处是:线程有自己独立的数据栈,由主程序启动,启动后立即将控制权还给主程序,由系统的分时系统控制运行;子程序和主程序共用数据栈,也由主程序启动,只有运行结束才把控制权还给主程序。

  原来是这么回事,记得以前写程序时,经常写不同功能的子程序和函数,有时,一不小心写了个死循环,整个程序就动不了,或者,有时处理的数据很费时,其实完全可以在后台处理,由于没有使用线程,主程序只有等子程序处理完才能继续。现在有了线程,很多不需要及时处理的功能完全可以使用线程完成了!赶快来做个实验吧!

  首先启动VS2008(不需要我说.Net的好处吧),新建一个VB.Net项目,在Form1里放两个按钮Button1和Button2,首先实验死循环代码,代码如下:

Public Class Form1
    Dim f As Boolean

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        f = False
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
         abc(6)        

    End Sub
    Private Sub abc(ByVal aa As Integer)
        While f '如果f为真,进入死循环

        End While
        MsgBox("实验完成" & Str(aa)) '使用子程序永远不会退出死循环,永远运行不到这里
    End Sub
End Class

  运行程序,点击按钮Button2,我们会发现该程序再也不能做其他操作了,连关闭操作都不行;这是使用子程序的结果,如果使用线程会怎么样呢?让我们看看,代码如下:

Public Class Form1
    Dim f As Boolean

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        f = False '全程变量f为假,可退出死循环
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim t As Threading.Thread '定义线程类
        f = True
        t = New Threading.Thread(AddressOf abc) '让线程类指向子程序
        t.Start(6) '启动线程
    End Sub
    Private Sub abc(ByVal aa As Integer)
        While f '如果f为真,进入死循环

        End While
        MsgBox("实验完成" & Str(aa)) '弹出对话窗口
    End Sub
End Class
  运行程序,同样点击按钮Button2,我们发现此时可以随意移动窗口,那么,怎么知道线程到底有没有运行呢?我们点击按钮Button1,程序立即弹出"实验完成 6"的对话窗口,这是死循环后面的代码,说明线程的确是在和主程序同时运行。

  结论:VB.Net可以很方便的使用线程,线程可以和主程序同时运行,一般用在非及时数据处理的情况下,线程可以和子程序一样,由主程序启动,可以传递和返回参数(在网上看到好多多线程怎么传递参数的文章,不知道是别人使用的VS版本低还是他们根本就没有实验我使用的方法)。

该文章版权属lowxiong所有,如要转载请注明作者 2010-5-11

编程旅途 | 阅读 11421 次
文章评论,共1条
撒地方
2014-06-25 14:02
1
游客请输入验证码
浏览18582次
文章归档
最新评论