Vb.net 多个线程执行顺序的问题

Posted

tags:

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

一个简单的程序,有两个线程,通过一个button让两个线程和一个多媒体计时器开始工作,在其中一个线程中对一个公共变量进行了赋值,,代码如下,让线程test1中test_time 等于该段代码执行完时候的时间,但是结果显示的还是对test_time的初始赋值,但是调试时候一句一句执行,显示的又不是初始赋值,两个线程执行顺序是什么,button中的语句执行完才执行test线程吗?
程序执行结果 文本框里显示的是“测试时间9999”,而后点击button2,显示的是“时间99”,但是调试时候一句一句执行,显示的就不是这个数了,不知道为什么。

多个线程执行的时候,是按CPU时钟轮番执行的,你可以在两个SUB中增加一条输出到即时窗口:debug.print test_time
看不出你的test1和test2做什么用的?
参考技术A 几乎是同时执行的追问

那为什么用i_duomeiti给test_time赋值没成功呢?

追答

当然不成功,因为线程start到后面过程结束,基本是同步执行了,意思是textbox1.text=???的语句几乎和线程start同时执行,那么就等于线程还没有执行就执行到textbox1.text=???,所以复制不成功,如果你在线程Abort前加点延时就能看到结果了

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 多线程

使用 CountDownLatch 控制多个线程执行顺序

使用 CountDownLatch 控制多个线程执行顺序

.net开发中,为何将100多个任务放入线程池却只有一个线程顺序执行