不同线程委托不能同时运行

wenluderen 2018-12-03 09:32:23
最近在VB.net里面使用了线程+委托。
发现一个问题,就是两个线程,他们各自的委托不能同时运行。
×××
众所周知,线程是为了独立运行的,不同的线程函数可以同时运行。就算是某一个线程函数进入死循环,另外一个线程函数还是可以运行的。

但是,线程的委托不可以。


Imports System.Threading
Public Class Form1
Dim m_PaiATape_Thread As Thread
Dim m_PaiBTape_Thread As Thread
Dim m_1 As Int32
Dim m_2 As Int32

Private Delegate Sub Gsz_WeiTuo_Pai_ATape(ByVal i As Integer) '此处声明的委托只有一个参数,没有返回值.大老板说想要一个经理,并且说了这个经理大致接口
Private Delegate Sub Gsz_WeiTuo_Pai_BTape(ByVal i As Integer) '此处声明的委托只有一个参数,没有返回值.大老板说想要一个经理,并且说了这个经理大致接口

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
m_PaiATape_Thread = New Thread(AddressOf xianchenghanshu01)
m_PaiATape_Thread.Start()
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
m_PaiBTape_Thread = New Thread(AddressOf xianchenghanshu02)
m_PaiBTape_Thread.Start()
End Sub


#Region "线程函数"
Private Sub xianchenghanshu01(ByVal i As Int16)
Dim gsz_1 As Int32 = 0

Dim Gsz_WeiTuo_Pai_ATape01 As New Gsz_WeiTuo_Pai_ATape(AddressOf xiaodi1) '实例化一个委托。 找到一个活生生的经理。并给这个经理配置一个小弟。
Me.Invoke(Gsz_WeiTuo_Pai_ATape01, 11) '执行这个委托。 这个活生生的经理 给小弟一个指令后,让他开始干活
Thread.Sleep(200)

End Sub
Private Sub xianchenghanshu02(ByVal i As Int16)
Dim gsz_2 As Int32 = 0
While True
Dim Gsz_WeiTuo_Pai_BTape01 As New Gsz_WeiTuo_Pai_BTape(AddressOf xiaodi2) '实例化一个委托。 找到一个活生生的经理。并给这个经理配置一个小弟。
Me.Invoke(Gsz_WeiTuo_Pai_BTape01, 11) '执行这个委托。 这个活生生的经理 给小弟一个指令后,让他开始干活
Thread.Sleep(200)
End While
End Sub
#End Region

#Region "小弟"
Private Sub xiaodi1(ByVal i As Int16)
Dim gsz_001 As Int32
While True
gsz_001 = gsz_001 + 1
Me.TextBox1.Text = gsz_001
Thread.Sleep(1000)
Me.Refresh()
End While
End Sub
Private Sub xiaodi2(ByVal i As Int16)
Dim gsz_002 As Int32
While True
gsz_002 = gsz_002 + 1
Me.TextBox2.Text = gsz_002
Thread.Sleep(1000)
Me.Refresh()
End While
End Sub
#End Region




Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Me.TextBox1.Text = m_1
Me.TextBox2.Text = m_2
End Sub
End Class

...全文
247 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_14933765 2018-12-06
  • 打赏
  • 举报
回复
sub tt()
end sub
begininvoke(tt)
wenluderen 2018-12-04
  • 打赏
  • 举报
回复
引用 2 楼 以专业开发人员为伍 的回复:
Control.Invoke 这个自然是阻塞 UI 线程(等待 UI 完成委托)的语法。你需要重新学习一下 .net 的这个概念。 程序中写什么 Sleep(....) 通常都是很糟糕的。你怎么知道要“卡死”200毫秒或者1000毫秒?为什么不是180和890毫秒?又为什么不是280和1190毫秒?这里写的200和1000毫秒纯粹是胡乱猜测的数值。 真正程序根本不写什么 Sleep。真正的程序设计是事件驱动的,不是阻塞的,所以要也就不需要乱写什么 Sleep 语句。
额之前做PLC(是一种可编程控制器,原理是循环扫描的)开发的。程序里面习惯使用延时(对应到计算机编程里面就是Sleep)。 PLC和计算机编程,最大的区别在于,一个是循环扫描,一个是事件驱动。 我会按照你意思,好好修改程序的架构。 谢谢
hhddzz 2018-12-04
  • 打赏
  • 举报
回复
你用Control.Invoke,又把函数弄回UI线程(更准确的说是Control所在线程)执行,当然不能并行运行。
  • 打赏
  • 举报
回复
属性,本身就是处理数据改变的编程任务的。因此你的属性本身就能捕获数据修改的时间点。同时 .net 还有 INotifyPropertyChanged接口以及 ObservableCollection<>类型这类机制用来对外提供事件通知接口。 所以这是设计模式,也就是说是必须学会的编程小伎俩。当一个程序捕获到某数据属性改变事件时,可以注册一句什么
Me.TextBox2.Text = gsz_002
这样的委托就足够了。要什么 while 循环?要什么 Me.Refresh 操作呢?
  • 打赏
  • 举报
回复
线程成为那些不懂得事件驱动编程设计概念的人的“救命稻草”,觉得只要是不懂交互操作设计,但是用“线程+死循环+超时阻塞+死等”的方式就能模拟事件驱动的处理逻辑了。 这种模拟是非常低级的做法。仅仅对于初中生编程爱好者学习编程时才适合。对于想专业学习编程的人,必须从一开始就学正规的事件驱动设计概念。要从设计思路上搞明白,而不是搞什么循环+阻塞的所谓“滥用线程概念”的噱头。
  • 打赏
  • 举报
回复
Control.Invoke 这个自然是阻塞 UI 线程(等待 UI 完成委托)的语法。你需要重新学习一下 .net 的这个概念。 程序中写什么 Sleep(....) 通常都是很糟糕的。你怎么知道要“卡死”200毫秒或者1000毫秒?为什么不是180和890毫秒?又为什么不是280和1190毫秒?这里写的200和1000毫秒纯粹是胡乱猜测的数值。 真正程序根本不写什么 Sleep。真正的程序设计是事件驱动的,不是阻塞的,所以要也就不需要乱写什么 Sleep 语句。
wenluderen 2018-12-03
  • 打赏
  • 举报
回复
我感觉,线程的委托函数 再次回到了程序的主线程里面运行了。 这个似乎不好 也很奇怪。

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧