求大神指导VB.net 线程 ThreadState 的使用方法 怎么获取线程状态,是不是被挂起堵塞停止等等

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求大神指导VB.net 线程 ThreadState 的使用方法 怎么获取线程状态,是不是被挂起堵塞停止等等相关的知识,希望对你有一定的参考价值。

比如 我启动了2个线程

dim xianc1 = New Threading.Thread(AddressOf 主线程)
xianc1.Start()
要怎么使用 ThreadState 才能知道 xianc1 的状态信息呢? 是否被挂起堵塞停止等等....

求大神指点... 要怎么写才知道 xianc1 线程的状态呀

参考技术A 用time控件啊,获取threadstate后,按指定时间间隔规定向界面刷新,线程必须是全局变量
用一个有退出条件的无限循环的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

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

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

追答

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

    显示savedialogue显示保存位置

    datagridview的数据集生成一份拷贝

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

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

追问

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

追答

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

追问

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

本回答被提问者采纳

以上是关于求大神指导VB.net 线程 ThreadState 的使用方法 怎么获取线程状态,是不是被挂起堵塞停止等等的主要内容,如果未能解决你的问题,请参考以下文章

vb.net求大神解释

求大神指点vs2012里的vb.net 编写的windows 服务怎么启动呀

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

VB.NET显示程序的进度,该怎么做?

跪求大神指导安卓room的制作~

求大神指导