vb.net 线程托管 窗口假死

不是说写了多线程之后,窗口就不会假死了吗?怎么我的还是假死啊?过路的大侠帮忙看看:一个窗体有两个richtextbox,创建了两个线程分别循环写这两个richtextbo... 不是说写了多线程之后,窗口就不会假死了吗?怎么我的还是假死啊?
过路的大侠帮忙看看:
一个窗体有两个richtextbox,创建了两个线程分别循环写这两个richtextbox
Imports System
Imports system.Threading
Public Class Form1
Delegate Sub dg(ByVal textt As String)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim th As New Thread(New ThreadStart(AddressOf method1))
th.Start()
Dim th1 As New Thread(New ThreadStart(AddressOf method2))
th1.Start()
End Sub
Public Sub method1()
Dim i As Long = 1
While (1)
settext("method 1 :" & i & vbCrLf)
i += 1
End While
End Sub
Public Sub method2()
Dim i As Long = 1
While (1)
settext1("method 2 :" & i & vbCrLf)
i += 1
End While
End Sub
Public Sub settext(ByVal i As String)
If Me.RichTextBox1.InvokeRequired Then
Dim d As New dg(AddressOf settext)
Me.Invoke(d, i)
Else
Me.RichTextBox1.Text = i & RichTextBox1.Text
End If
End Sub
Public Sub settext1(ByVal i As String)
If Me.RichTextBox2.InvokeRequired Then
Dim d As New dg(AddressOf settext1)
Me.Invoke(d, i)
Else
Me.RichTextBox2.Text = i & Me.RichTextBox2.Text
End If
End Sub
End Class
注意:我这里给出的是新建两个线程去操作窗体,不是新建“一个”线程。

我也很清楚问题是出在循环中不断调用me.invoke(d,i)导致的假死,可是我还是不清楚这段代码怎么改,能否帮忙改一下?
====================================================================
多谢,可是如果去掉thread.sleep(30)还是会假死,怎么解决啊?
展开
 我来答
百度网友998ec8b
2009-05-20 · TA获得超过234个赞
知道答主
回答量:99
采纳率:0%
帮助的人:81.8万
展开全部
Me.Invoke(d, i)
问题出在这里!
直接用Me.Invoke把实际的执行任务提交给主线程运行
所以你的处理函数实际上是在主线程中运行的,新线程等于没用

正确的作法是,定义一个函数为入口的线程,并启动它
在需要调用的时候再使用Invoke来调用委托来进行更改。
----------------------------------------------------------------
方法已经给你说明白了,新建1个线程和2个线程来操作有什么不通用的哪??
问题不是线程个数的问题,是你线程中的函数一直在调用settext和settext1两个函数,而这两个函数都是处于method 方法 的while的循环中,相当于不间歇的在使用 Me.Invoke(d, i)这个方法。
----------------------------------------------------------------
如果你要不停地通过另外一个线程修改richtextbox内的内容,那也可以新启动一个线程,由这个线程的入口方法创建一个richtextbox ,再由这个线程来对这个richtextbox 进行操作。当然,你也可以用不安全的线程间的操作方法来实现。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
坚戈
2009-05-25 · TA获得超过1166个赞
知道小有建树答主
回答量:1325
采纳率:0%
帮助的人:848万
展开全部
======================================
因为代码的执行速度N快 你又用If Me.RichTextBox1.InvokeRequired Then
所以 这边在执行 那边也执行 导致冲突(貌似是这样的意思 我也说不清楚)
======================================

可以用委托去完成操作 保证不假死
我刚好之前有个实验实例 你可以看看

Imports System.Threading
Public Class Form1
Delegate Sub dg(ByVal textt As String)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim t1 As New Thread(New ThreadStart(AddressOf ds1))
t1.Start()
Dim t2 As New Thread(New ThreadStart(AddressOf ds2))
t2.Start()
End Sub
Sub ds1()
For i As Integer = 0 To 3000
Me.BeginInvoke(New EventHandler(AddressOf ds11), i)
Thread.Sleep(30)
Application.DoEvents()
Next
End Sub
Sub ds11(ByVal sender As System.Object, ByVal e As System.EventArgs)
ListBox1.Items.Add(sender.ToString & Chr(6) & TextBox1.Text)
End Sub
Sub ds2()
For i As Integer = 0 To 3000
Me.BeginInvoke(New EventHandler(AddressOf ds22), i)
Thread.Sleep(30)
Application.DoEvents()
Next
End Sub
Sub ds22(ByVal sender As System.Object, ByVal e As System.EventArgs)
TextBox1.Text = sender.ToString
End Sub
End Class
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式