在vb.net中运用多线程实现远程数据收集[图](3)
数据接收线程
数据接收线程的工作流程如图二所示。主要功能是:将挂起连接的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)
- 上一篇:基于VB-PRINTER对象的动态报表打印[图]
- 下一篇:vb实现老板键功能[图]