Foxtable(狐表)用户栏目专家坐堂 → [求助]子线程销毁


  共有4570人关注过本帖树形打印复制链接

主题:[求助]子线程销毁

帅哥哟,离线,有人找我吗?
kb9702
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:90 积分:1148 威望:0 精华:0 注册:2017/10/31 16:34:00
[求助]子线程销毁  发帖心情 Post By: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


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

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



 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110744 积分:563646 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/2/21 19:56:00 [只看该作者]

全局代码使用public定义变量

public ArtSubThread As System.Threading.Thread

 回到顶部
帅哥哟,离线,有人找我吗?
kb9702
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:90 积分:1148 威望:0 精华:0 注册:2017/10/31 16:34:00
  发帖心情 Post By: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()

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

 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110744 积分:563646 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:90 积分:1148 威望:0 精华:0 注册:2017/10/31 16:34:00
  发帖心情 Post By: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

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

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



 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110744 积分:563646 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:90 积分:1148 威望:0 精华:0 注册:2017/10/31 16:34:00
  发帖心情 Post By:2023/2/21 21:03:00 [只看该作者]

用了还是不行,反而出现线程没有终止直接退出后那种程序崩溃后的错误。
现在用了两个按钮,一个停止,停止点了之后出现退出按钮,然后点退出这种方式。图片点击可在新窗口打开查看

 回到顶部
帅哥,在线噢!
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110744 积分:563646 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/2/21 21:07:00 [只看该作者]

那就这样吧。我这边也没法测试。

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

 回到顶部
帅哥哟,离线,有人找我吗?
kb9702
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:90 积分:1148 威望:0 精华:0 注册:2017/10/31 16:34:00
  发帖心情 Post By:2023/2/21 21:10:00 [只看该作者]

是用异步函数来关闭窗口吗?

 回到顶部
帅哥,在线噢!
有点蓝
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110744 积分:563646 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/2/21 21:24:00 [只看该作者]

用异步函数替代上面的线程

 回到顶部
总数 12 1 2 下一页