VB.net多线程编程问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VB.net多线程编程问题相关的知识,希望对你有一定的参考价值。

软件要连接远程4台计算机的固定端口和本地计算机的8个端口。要实时判断网络状态(显示到界面)并且读取12个端口的数据进行处理,用my.Computer.Network.Ping(IP,Timeout)判断网络状态.现在用的是TIMER控件。如果网络未连接在LOAD时要等10秒才能进入软件。网络正常但是端口没收到数据时会处于无响应状态。这种情况如果用多线程能解决吗?具体方法?
是连接不上的时候软件无响应10秒,要避免这个问题出现。 端口没有读到数据的时候还要继续去读端口,直到有数据。

你可以在timer前用if判断网络状态,
如断开,可用
threading.Thread.Sleep(10000) ‘当前线程挂起10秒
’可以开一个新线程去读取脱机数据。

如连接,则继续执行。

补充:
dim i as integer
'超过100次退出,避免死循环
for i=0 to 100
try

'ping你的端口

if ‘ok

exit for
else
threading.Thread.Sleep(10000) ‘当前线程挂起10秒
end
Catch ex As Exception
End Try
next
参考技术A 你到底想干嘛,能说明白吗?怎么就一个等10秒才进入软件,没数据时干什么?可以去CSDN论坛

vb.net 多线程 访问界面控件

网上查了,都说用委托 invoke,就是不知道具体怎么做。麻烦大神了!
要执行的函数是 daochu() 就是把 datagridview1导出excel
private sub daochu()
SaveFileDialog1.DefaultExt = "xls"
SaveFileDialog1.Filter = "Text documents *.xls|*.xls|Text documents *.xlsx|*.xlsx|All File *.*|*.*"
Dim yon As SaveOptions = SaveFileDialog1.ShowDialog()
If yon = 1 Then
ToolStripProgressBar1.Style = ProgressBarStyle.Blocks
(省略创建exce 对象)
With xlapp.ActiveSheet
.cells(1, 1).value = Label1.Text & " 汇率 " & TextBox1.Text
.range("A1:M1").MergeCells = True
.Range("A1").HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
.Range("A1").VerticalAlignment = Excel.XlVAlign.xlVAlignCenter
' .range("A1:N1").Borders(XlBordersIndex.xlEdgeBottom).LineStyle = Excel.XlLineStyle.xlLineStyleNone
.range("A1:X1").Borders(Excel.XlBordersIndex.xlEdgeBottom).LineStyle = 1
.range("A2:X2").Borders(Excel.XlBordersIndex.xlEdgeBottom).LineStyle = 1
'.range("A20:N20").Borders(Excel.XlBordersIndex.xlEdgeBottom).LineStyle = 1
.cells(2, 1).value = "编号"

For i = 0 To Datagridview1.RowCount - 1
For j = 0 To Datagridview1.ColumnCount - 1
.cells(3 + i, j + 1).value = Datagridview1.Rows(i).Cells(j).Value
.cells(3 + i, j + 1).Borders(Excel.XlBordersIndex.xlEdgeTop).LineStyle = 1
.cells(3 + i, j + 1).Borders(Excel.XlBordersIndex.xlEdgeBottom).LineStyle = 1
.cells(3 + i, j + 1).Borders(Excel.XlBordersIndex.xlEdgeRight).LineStyle = 1
.cells(3 + i, j + 1).Borders(Excel.XlBordersIndex.xlEdgeLeft).LineStyle = 1
If CStr(.cells(3 + i, 2).value) = "合计" Then .range("A" & 3 + i & ":X" & 3 + i).Interior.Color = 10079487
p_value = (i * (Datagridview1.ColumnCount) + j + 1) / (Datagridview1.RowCount * Datagridview1.ColumnCount)
If p_value <= 100 Then
ToolStripProgressBar1.Value = p_value
End If
Application.DoEvents()
Next
Next
End With
省略保存excel代码
end sub
sub button1_click ()
Dim Thread2 As New System.Threading.Thread(AddressOf daochu)
Thread2.ApartmentState = ApartmentState.STA
Thread2.Start()
end sub

参考技术A 建议你使用BackGroundWorker控件。将代码写入控件的事件中,使用它的Start方法就可以开始工作了。是与主程序同时进行的。 参考技术B 你的问题是你不明白你为什么要用线程
这个地方用线程,然后再用invoke简直是多此一举追问

这是导出 excel,数据很多,开始导出后,好几分钟,软件不能动。所以我想用多线程,这样用户可以继续其他操作。

追答

不需要委托,我不知道到你的数据量有多大,不过我觉得做法是

    显示savedialogue显示保存位置

    datagridview的数据集生成一份拷贝

   3.  遍历拷贝的数据集,生成excel

其中第三步封装为方法,放在线程中执行

追问

我把 datagridview 改成 datatble 了,数据从数据库来 ,我真笨!
另外一个小问题,代码都没变,就是那个ToolStripProgressBar1.Value = p_value这个怎么办?我要再一边遍历数据时一边显示进度条

追答

这一步要使用委托,
其实如果你代码规范不严格的话,直接在窗体启动的时候设置CheckForIllegalCrossThreadCalls = false; 就行了

追问

这个没用。我在load里写了这句。有说什么的控件不能成为什么控件的父级。。。
悲剧啊。现在我只好定义一个全局变量,用 timer来不断更新那个进度条

本回答被提问者采纳

以上是关于VB.net多线程编程问题的主要内容,如果未能解决你的问题,请参考以下文章

vb.net 多线程 访问界面控件

VB.net 如何设计多线程运行

VB.NET多线程入门

具有许多数据库调用的 VB.net 多线程

VB.net可以多线程控制同一个窗体及其控件吗

vb.net多线程,循环导致窗口界面假死的问题