do 占用cpu50%的问题-多线程

ok9966 2010-01-28 11:39:44
多线程中的。:代码如下
Do
For i = 0 To 10


If Form1.arrThread(i).IsAlive = False Then
ii = ii + 1
End If

Next
Application.DoEvents()
Loop Until ii = 11


我要实现的功能其实就是获取11个线程的isalive都结束。所以ii=11是必须的。
而且我试过。thread.sleep(1000) 这个不行了。

请高手来指点下了。怎么改。

在do的外围还有个for的循环。因为必须ii=11才可以继续运行下去。
请高人指点

...全文
365 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
ok9966 2010-02-05
  • 打赏
  • 举报
回复
 Dim d As System.Threading.Thread
ListBox1.Items.Clear()
For eee As Integer = 1 To 5
Dim toget1 As New enn(ListBox1, eee)
d = New System.Threading.Thread(AddressOf toget1.tolistboxadd,waitHandles(eee))
d.Start()
Next

如果建立waitHandles 会出现错误 1 “System.Threading.ThreadStart”是委托类型,要求将单个“addressof”表达式作为构造函数的唯一参数。 这个要怎么解决???

看了msdn的那个帮助。他重要的是 Private Shared waitHandles() As WaitHandle = _
{New AutoResetEvent(False), New AutoResetEvent(False)}

ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(0))
ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(1))
WaitHandle.WaitAll(waitHandles)

这些。我模仿改了下我自己的程序。就出现错误了。要怎么搞定呢。enn是自定义的类。
ok9966 2010-02-02
  • 打赏
  • 举报
回复
代码是理解了。呵呵。不过对于sub的使用。没什么经验。Sub ThreadCompleted

这个肯定可以返回所有线程结束。

但是我在没试过这个的使用》比如说我的一个执行代码结构

for i=0 to ubound(内容数量)
1.这里开始读取数据库里面符合内容(i)
2.调用多线程处理数据库内容


3.这里也就是要判断所有线程结束了。试想下:调用类似Sub ThreadCompleted的过程 。然后确认所有的都结束才可以next下一步的运行。(这里其实就是我的问题了。不知道到了事件这里要怎么改了。)
因为如果是sub。。外围的for循环我想可能就会一次就过去了。。继续请教。modest兄弟说下这类型的一般要怎么修改事件。


next
ok9966 2010-02-02
  • 打赏
  • 举报
回复
没想到有这么多的应用。真实学海无法啊
beiguren 2010-02-02
  • 打赏
  • 举报
回复
用WaitHandle来实现多线程的同步。11个线程就创建11个WaitHanle,然后调用WaitHanle.WaitAll(WaitHandle[])方法就可以了。

例子:http://msdn.microsoft.com/en-us/library/system.threading.waithandle.aspx
yanlongwuhui 2010-02-01
  • 打赏
  • 举报
回复
MARK
迈克揉索芙特 2010-01-31
  • 打赏
  • 举报
回复
请问您没有理解我上面代码的意思吧?用我那个例子根本不用循环了。
至于你说的class,使用的时候要实例化哦。
建议楼主仔细领悟一下我的例子,然后你就明白了。
ok9966 2010-01-31
  • 打赏
  • 举报
回复
比如说:Do
For i = 0 To 10


If Form1.arrThread(i).IsAlive = False Then
ii = ii + 1
End If

Next
Application.DoEvents()
Loop Until ii = 11

我的这个代码。如果是使用了事件的话。那么要怎么修改呢。不用 thread.sleep (10)
迈克揉索芙特 2010-01-31
  • 打赏
  • 举报
回复
Public Shared Sub Main()
Dim Thread As Thread
ThreadCount2 = 0
'事件与过程绑定
AddHandler Completed, AddressOf ThreadCompleted
'创建并执行线程
For i As Integer = 1 To ThreadCount1
Dim d As ThreadClass = New ThreadClass
Thread = New Thread(New ParameterizedThreadStart(AddressOf ThreadProcess))
Thread.Start(i)
Next
Console.ReadKey()
End Sub

注意,我上面代码中的红色部分是多余的,原计划用委托来的,后来直接用ParameterizedThreadStart了。那句忘记了删除。
迈克揉索芙特 2010-01-31
  • 打赏
  • 举报
回复
把你的代码简化成伪代码发上来,否则一两句说不清楚哦。
ok9966 2010-01-30
  • 打赏
  • 举报
回复
兄弟问下:
如果线程是通过事件来判断的。自己写的class 如果在form1这些窗体中调用的话。会出现没申明 。或者说什么 不是。。。的实例

这样的话事件要怎么调用呢。

怎么去触发事件: 如上的 '触发事件
RaiseEvent Completed(Nothing, Nothing)
要怎么修改

另外的一个问题是:比如我的那个要一直do 获得线程状态的。在实际操作中。外面还有一层循环

for i=0 to ubound(内容)
内容读取的多线程处理
next

这类型的:要怎么确认线程事件完成后。才下一步next呢。

谢谢兄弟了。呵呵
迈克揉索芙特 2010-01-30
  • 打赏
  • 举报
回复
TO楼主,就不给你发邮件了,直接把代码贴这里。有不明白的地方尽管回帖问。

Imports System
Imports System.Threading

Public Class ThreadClass
Private Shared Event Completed As EventHandler
Private Shared ThreadCount1 As Integer = 11 '创建11个线程
Private Shared ThreadCount2 As Integer = 0

Public Shared Sub Main()
Dim Thread As Thread
ThreadCount2 = 0
'事件与过程绑定
AddHandler Completed, AddressOf ThreadCompleted
'创建并执行线程
For i As Integer = 1 To ThreadCount1
Dim d As ThreadClass = New ThreadClass
Thread = New Thread(New ParameterizedThreadStart(AddressOf ThreadProcess))
Thread.Start(i)
Next
Console.ReadKey()
End Sub

'每个线程结束的时候都要调用的时间
Private Shared Sub ThreadCompleted(ByVal sender As Object, ByVal e As EventArgs)
ThreadCount2 += 1
If ThreadCount1 = ThreadCount2 Then
Console.WriteLine("这是所有线程执行完才执行的内容")
End If
End Sub

'线程处理过程
Private Shared Sub ThreadProcess(ByVal parameter As Object)
For i As Integer = 0 To 100
Console.WriteLine("这是线程{0}中执行的内容", parameter.ToString)
Next
'触发事件
RaiseEvent Completed(Nothing, Nothing)
End Sub
End Class


ps:本来也想贴到blog一份,blog今晚却犯病了。
ok9966 2010-01-30
  • 打赏
  • 举报
回复
Modest 兄弟有没有时间帮我写个简单点的范例发下到我的email里面吧。。多线程加 事件通知
318795303#qq.com 最好用vb2005哦 O(∩_∩)O~
ok9966 2010-01-30
  • 打赏
  • 举报
回复
怎么使用事件通知呢。这个我不会呢。。多线程也是临时搞起来的。
迈克揉索芙特 2010-01-30
  • 打赏
  • 举报
回复
为什么不用事件通知的方法呢?定义一个事件a,每个线程结束的时候都调用a,在a里面判断调用的次数来决定是否执行你后面的代码。
迈克揉索芙特 2010-01-30
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ok9966 的回复:]
System.Threading.Thread.Sleep(10) 这个不就是让有的线程都睡觉了。。那不是会堵塞了。
[/Quote]
不会,试一下就知道了,据我的经验能解决你的问题。
ok9966 2010-01-30
  • 打赏
  • 举报
回复
System.Threading.Thread.Sleep(10) 这个不就是让有的线程都睡觉了。。那不是会堵塞了。
迈克揉索芙特 2010-01-30
  • 打赏
  • 举报
回复
10就是让cpu睡10毫秒立马干活
如果是1000毫秒,cpu光忙着去睡觉了,并且睡觉的时候还挂起线程。
ok9966 2010-01-30
  • 打赏
  • 举报
回复
Modest 兄弟。我想知道为什么System.Threading.Thread.Sleep(10) 这个为10 呢。呵呵。
如果为100,1000 什么的就感觉输出的控件有点卡滞了
迈克揉索芙特 2010-01-30
  • 打赏
  • 举报
回复
把Sleep(10)换成System.Threading.Thread.Sleep(10)
ok9966 2010-01-30
  • 打赏
  • 举报
回复
解决cpu占用问题就可以搞定了。呵呵

如果说 重复判断
那么我可以在do下面开始给ii赋值为0
加载更多回复(9)

16,557

社区成员

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

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