求大神指导VB.net 线程 ThreadState 的使用方法 怎么获取线程状态,是不是被挂起堵塞停止等等
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求大神指导VB.net 线程 ThreadState 的使用方法 怎么获取线程状态,是不是被挂起堵塞停止等等相关的知识,希望对你有一定的参考价值。
比如 我启动了2个线程
dim xianc1 = New Threading.Thread(AddressOf 主线程)
xianc1.Start()
要怎么使用 ThreadState 才能知道 xianc1 的状态信息呢? 是否被挂起堵塞停止等等....
求大神指点... 要怎么写才知道 xianc1 线程的状态呀
用一个有退出条件的无限循环的sub也行。
线程开始就触发该过程,用无限循环来刷新状态,线程完成即退出无限循环。局部变量的线程也可以用这种方式。
不过用法要正确,否则会出问题。追问
就是不知道 怎么使用 threadstate 怎么才能取到 xianc1 的状态
追答ThreadState.ToString()
不是这个吗?
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
这个地方用线程,然后再用invoke简直是多此一举追问
这是导出 excel,数据很多,开始导出后,好几分钟,软件不能动。所以我想用多线程,这样用户可以继续其他操作。
追答不需要委托,我不知道到你的数据量有多大,不过我觉得做法是
显示savedialogue显示保存位置
datagridview的数据集生成一份拷贝
3. 遍历拷贝的数据集,生成excel
其中第三步封装为方法,放在线程中执行
追问我把 datagridview 改成 datatble 了,数据从数据库来 ,我真笨!
另外一个小问题,代码都没变,就是那个ToolStripProgressBar1.Value = p_value这个怎么办?我要再一边遍历数据时一边显示进度条
这一步要使用委托,
其实如果你代码规范不严格的话,直接在窗体启动的时候设置CheckForIllegalCrossThreadCalls = false; 就行了
这个没用。我在load里写了这句。有说什么的控件不能成为什么控件的父级。。。
悲剧啊。现在我只好定义一个全局变量,用 timer来不断更新那个进度条
以上是关于求大神指导VB.net 线程 ThreadState 的使用方法 怎么获取线程状态,是不是被挂起堵塞停止等等的主要内容,如果未能解决你的问题,请参考以下文章