以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [求助]子线程销毁  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=185417)

--  作者:kb9702
--  发布时间:2023/2/21 19:16:00
--  [求助]子线程销毁

全局代码
Dim nthread As System.Threading.Thread

调用

vars("stop") = False
nthread = New System.Threading.Thread(AddressOf thread_sub1)
nthread.start(Nothing)



BeforeCloseProject事件

nthread.Join()


我在全局代码里定义了 

Dim ArtSubThread As System.Threading.Thread


在窗口里按钮事件里调用的时候就直接提示这个错误了。。


ArtSub函数里是

以下内容为程序代码:

1 Public Function ArtSub()
2 While ARTLogic < 2
3 If ARTLogic = 0 Then
4 ARTCount += 1
5 Dim Val3() As Byte = New Byte() {1, 4, 1, 0, 0, 8, 240, 48}
6 Ports("COM2").Write(Val3, 0, Val3.Length)
7 Threading.Thread.Sleep(7)
8 Dim str As String
9 Dim cnt As Integer = Ports("COM2").BytesToRead
10 If cnt > 0 Then
11 Dim Val(cnt - 1) As Byte
12 Ports("COM2").Read(val, 0, cnt)
13 For i As Integer = 0 To cnt - 1
14 If (i Mod 21) = 3 Or (i Mod 21) = 4 Or (i Mod 21) = 7 Or (i Mod 21) = 8 Or (i Mod 21) = 11 Or (i Mod 21) = 12 Or (i Mod 21) = 15 Or (i Mod 21) = 16 Then
15 str += Val(i).ToString("X2")
16 End If
17 Next
18 End If Threading.Thread.Sleep(1)
19 End If
20 End While
21 End Function


直接关闭窗口的时候线程没销毁,就直接奔溃了。。

想问下有没有什么方法可以单独销毁这个线程。



--  作者:有点蓝
--  发布时间:2023/2/21 19:56:00
--  
全局代码使用public定义变量

public ArtSubThread As System.Threading.Thread

--  作者:kb9702
--  发布时间:2023/2/21 20:15:00
--  
忘记全局代码要用Public了。。

还有一个想问下

为什么退出按钮设置了这个会卡住,窗口不会关闭,卡住了。
退出按钮代码如下:
以下内容为程序代码:

1 ARTLogic = 2
2 Threading.Thread.Sleep(10)
3 e.Form.TimerEnabled = False
4 Threading.Thread.Sleep(10)
5 ArtSubThread.Join()
6 Threading.Thread.Sleep(10)
7 e.Form.Close()


如果退出代码如下:
以下内容为程序代码:

1 ARTLogic = 2
2 Threading.Thread.Sleep(10)
3 e.Form.TimerEnabled = False
4 Threading.Thread.Sleep(10)
5 ArtSubThread.Join()

点了退出后在手动关闭下窗口就可以了。

--  作者:有点蓝
--  发布时间:2023/2/21 20:40:00
--  
麻烦下次发代码不要发这种有行号的代码。

试试
1 ARTLogic = 2
2 Threading.Thread.Sleep(10)
3 e.Form.TimerEnabled = False
4 Threading.Thread.Sleep(10)
7 e.Form.Close()
5 ArtSubThread.Join()

--  作者:kb9702
--  发布时间:2023/2/21 20:49:00
--  
不行还是会卡住
e.Form.TimerEnabled = False
Threading.Thread.Sleep(10)
If ArtSubThread.IsAlive = True Then
    ARTLogic = 2
    MessageBox.Show("终止线程")
    ArtSubThread.Join()
    Threading.Thread.Sleep(1000)
    e.Form.Controls("Exit1").PerformClick()
Else
    MessageBox.Show("线程")
End If

退出按钮用这个代码的时候,会先弹出终止线程这个提示,之后又弹出线程这个提示

有行号的代码是使用论坛窗口上面的插入代码功能自动带出来。。。



--  作者:有点蓝
--  发布时间:2023/2/21 20:54:00
--  
退出按钮
e.Form.TimerEnabled = False
e.Form.close

窗口afterclose事件
If ArtSubThread.IsAlive = True Then
    ARTLogic = 2
    ArtSubThread.Join()
End If


--  作者:kb9702
--  发布时间:2023/2/21 21:03:00
--  
用了还是不行,反而出现线程没有终止直接退出后那种程序崩溃后的错误。
现在用了两个按钮,一个停止,停止点了之后出现退出按钮,然后点退出这种方式。图片点击可在新窗口打开查看

--  作者:有点蓝
--  发布时间:2023/2/21 21:07:00
--  
那就这样吧。我这边也没法测试。

或者试试使用Foxtable提供的异步函数

--  作者:kb9702
--  发布时间:2023/2/21 21:10:00
--  
是用异步函数来关闭窗口吗?
--  作者:有点蓝
--  发布时间:2023/2/21 21:24:00
--  
用异步函数替代上面的线程