龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VB开发 >

在vb.net中运用多线程实现远程数据收集[图](3)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
数据接收线程 数据接收线程的工作流程如图二所示。主要功能是:将挂起连接的DVS上传数据从流中读取出来,创建数据写入线程,并在listbox中显示。 从保

  数据接收线程

   数据接收线程的工作流程如图二所示。主要功能是:将挂起连接的DVS上传数据从流中读取出来,创建数据写入线程,并在listbox中显示。

  从保存的socket数组中读取字节流时,必须考虑以下问题:

  一、有些DVS可能会在工作一段时间后发生设备故障或者网络中断,但服务器保存的是其历史socket,因此,必须判断其connect属性,即设备是否在线。

  二、为了减少服务器的空等时间,必须判断流对象(stream)的DataAvailable属性。

  三、创建线程saveToDb时,必须考虑传入参数的问题。通常的线程创建是不可提供参数的。我们将线程saveToDb的执行体封装到一个类中,通过初始化类的成员变量的方法,来达到传送参数的目的。

  四、由于本线程是长驻内存并循环执行的。因此,应当在适当的地方阻止,否则,CPU的利用率将达几乎100%。

  这部分的代码如下:

Public Sub RecDataProc()

        Dim i As Integer

        Dim c As TcpClient

        While (True)

            Try

                For i = 0 To socketList.Count - 1

          If socketList.Item(i).client.connected Then '如果该连接在线

             Dim dh1 As DelegateHandler = New DelegateHandler(AddressOf displayStatusBarPanel2)

'New 出一个委托并指定委托方法

                      Me.Invoke(dh1, New Object() {CStr(i)})  '调用invoke方法

                      c = socketList.Item(i)

                      Dim stream As NetworkStream = c.GetStream()

                      If stream.DataAvailable Then

                      Dim dh As DelegateHandler1 = New DelegateHandler1(AddressOf ShowInBox)

                      Dim readbuff As New ReadBuffClass(c, stream, Connection, dh) '由构造函数来初始化成员变量

                      ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf readbuff.ReadBuff), readbuff)’把具体从流中读取数据的工作交给线程池的线程来进行

                       Dim workerThreads, portThreads As Integer

                       ThreadPool.GetAvailableThreads(workerThreads, portThreads)

                       Dim dh2 As DelegateHandler = New DelegateHandler(AddressOf displayStatusBarPanel4)

精彩图集

赞助商链接