多线程与UI交互的问题2

dongshanyu 2006-08-14 11:42:41
见老帖:http://community.csdn.net/Expert/TopicView3.asp?id=4943838
采用Knight94(愚翁) 的方法解决了"区分并稳定的显示各线程反馈的信息"的问题,但随之冒出来一个新的问题,就是:在线程执行的过程中,界面不能动了。
...全文
362 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongshanyu 2006-08-15
  • 打赏
  • 举报
回复
up
水如烟 2006-08-14
  • 打赏
  • 举报
回复
呵,我刚好也在试用这个东西.

社内闲聊贴(2)
http://community.csdn.net/Expert/topic/4932/4932182.xml?temp=.2726709

要让界面发应,
While t.IsAlive
Windows.Forms.Application.DoEvents()
End While

仅供参考.
dongshanyu 2006-08-14
  • 打赏
  • 举报
回复
如果这样(先执行完线程A,再执行线程B),若在线程A出现了堵塞,线程B岂不是也不能执行了?
dongshanyu 2006-08-14
  • 打赏
  • 举报
回复
to scow
使用了Application.DoEvents后,界面不冻结了,:)
例如,现有5个线程,其执行后的结果显示如下:
=======================================
2006-08-14 15:42.11 Thread0 Item 0 ...Ok
2006-08-14 15:42.11 Thread0 Item 1 ...Ok
2006-08-14 15:42.11 Thread1 Item 0 ...Ok
2006-08-14 15:42.11 Thread2 Item 0 ...Ok
2006-08-14 15:42.11 Thread3 Item 0 ...Ok
2006-08-14 15:42.11 Thread4 Item 0 ...Ok
2006-08-14 15:42.11 Thread4 Item 1 ...Ok
..
2006-08-14 15:42.22 Thread4 Item 99 ...Ok
2006-08-14 15:42.22 Thread3 Item 1 ...Ok
..
2006-08-14 15:42.33 Thread3 Item 99 ...Ok
2006-08-14 15:42.33 Thread2 Item 1 ...Ok
...
2006-08-14 15:42.44 Thread2 Item 99 ...Ok
2006-08-14 15:42.44 Thread1 Item 1 ...Ok
...
2006-08-14 15:42.57 Thread1 Item 99 ...Ok
2006-08-14 15:42.57 Thread0 Item 2 ...Ok
...
2006-08-14 15:42.33 Thread0 Item 99 ...Ok
=======================================
根据上面的线程反馈的信息,我观察到一个现象,各线程好像并不是轮流执行的,好像是先执行完某个线程,然后执行另外一个线程。




水如烟 2006-08-14
  • 打赏
  • 举报
回复
你在method的循环体里加上Windows.Forms.Application.DoEvents()
dongshanyu 2006-08-14
  • 打赏
  • 举报
回复
While objThread(N).IsAlive
Windows.Forms.Application.DoEvents()
End While
去掉后上面那段代码后,界面在线程运行时还是处于冻结状态
scow 2006-08-14
  • 打赏
  • 举报
回复
把Application.DoEvents();加在
strMsg = "Item " & i & "... Ok"
ToAddLvwItemOfLog(mLvwLog, strThread, strMsg)
//add here
Thread.Sleep(10)
这里
水如烟 2006-08-14
  • 打赏
  • 举报
回复
目的是为了执行LzmTW.ApplicationBase.WaitingForm.DefaultForm.Close()

对不起,不好意思.
水如烟 2006-08-14
  • 打赏
  • 举报
回复
While objThread(N).IsAlive
Windows.Forms.Application.DoEvents()
End While
哦,我弄错了,上面这行代码在我的程序中是有特别用义的,因为自己理解不深,所以贴了出来,不应该如此.我的用在这个地方:它显示的是一个提示框.

Public Shared Sub AutoShow(ByVal threadStart As System.Threading.ThreadStart, ByVal formType As MessageFormType)
SetDefaultFormType(formType)
DefaultForm.Show()
Dim t As New System.Threading.Thread(threadStart)
t.Name = threadStart.Method.ToString & Now.Ticks.ToString
t.Start()
While t.IsAlive
Windows.Forms.Application.DoEvents()
End While
LzmTW.ApplicationBase.WaitingForm.DefaultForm.Close()
End Su
水如烟 2006-08-14
  • 打赏
  • 举报
回复
呵,线程我是不懂的.只能试着来做.
Knight94 2006-08-14
  • 打赏
  • 举报
回复
如下这些语句干什么用的,等待线程?把这部分删除
While objThread(N).IsAlive
Windows.Forms.Application.DoEvents()
End While
dongshanyu 2006-08-14
  • 打赏
  • 举报
回复
不管我开几个线程,同时Thread.Sleep停留的时间多长,在线程执行期间,界面还是被冻结了;加了线程IsAlive的判定,但好像也没起到效果 :(,下面是我的代码,两位帮我看看问题在哪?
==========================
...
Dim N As Integer
Dim objThread(intThreadNum) As Thread

For N = 0 To intThreadNum - 1

Dim intThreadIndex As Integer, strThreadName As String
intThreadIndex = N
strThreadName = "Thread" & N

Dim objTest As clsTest
objTest = New clsTest(intThreadIndex, strThreadName, lvwLog)

objThread(N) = New Thread(AddressOf objTest .Test)
objThread(N).Name = strThreadName
objThread(N).ApartmentState = ApartmentState.STA
objThread(N).Start()

While objThread(N).IsAlive
Windows.Forms.Application.DoEvents()
End While

Next
...
-----------------------------------
Imports System.Threading
Public Class clsTest
Private mThreadIndex As Integer
Private mThreadName As String
Private mLvwLog As ListView

Sub New()
mThreadIndex = 0
mThreadName = ""
End Sub

Sub New(ByVal intThreadIndex As Integer, ByVal strThreadName As String, _
ByVal objLvw As ListView)
mThreadIndex = intThreadIndex
mThreadName = strThreadName
mLvwLog = objLvw
End Sub

Public Sub Test()
Dim mi As MethodInvoker
mi = New MethodInvoker(AddressOf ToShowMsg)
mLvwLog.Invoke(mi)
End Sub

Private Sub ToShowMsg()
Dim strThread As String
strThread = Me.mThreadName
Dim strMsg As String

Dim intMax As Integer
intMax = 100

Dim i As Integer
For i = 0 To intMax - 1
strMsg = "Item " & i & "... Ok"
ToAddLvwItemOfLog(mLvwLog, strThread, strMsg)
Thread.Sleep(10)
Next
End Sub

Private Sub ToAddLvwItemOfLog(ByVal objLvw As ListView, ByVal strThread As String, ByVal strMsg As String)

End Sub

End Class
Knight94 2006-08-14
  • 打赏
  • 举报
回复
to 在线程执行的过程中,界面不能动了

造成这个原因是你的线程占cpu的资源太多了,适当在线程中调用Thread.Sleep( 10 ),效果会好很多。

16,549

社区成员

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

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