多线程速度变慢

wenwen_esyuan 2014-06-29 07:52:41
比如一个无限循环
Dim 次数 As Integer = 0
Dim Start_T = GetTickCount
Do While True
次数 += 1
Threading.Thread.Sleep(100)
‘’dm.KeyPress(122)
‘’dm.KeyPress(112)
‘’中间所做的事
If 次数 = 50 Then
Dim Stop_T = GetTickCount
Console.WriteLine("运行50次所用时间(毫秒):{0}", Stop_T - Start_T)
次数 = 0
Start_T = GetTickCount
End If
Loop

放到一个class类中用多线程调用,如果是第一次调用循环50次用时10秒,第二次相近,当调用5次以上时,明显变慢,大约用时22秒左右,用线程池也一样,如何调用多次时效率不下降太多呢?什么方法调用都行,我需要同时运行多个上面的的循环。
...全文
695 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenwen_esyuan 2014-07-04
  • 打赏
  • 举报
回复
非常感谢上面的回复。仔细拜读了上面的回复,都有道理,顺着思路试了下,终于找到原因。原来是因为我加入的测试dm对象是STA模式,如果不声明或者用线程池都会导致多次调用时速度明显变慢,基本是成倍变慢,当声明为STA模式时每增加一次调用所影响的速度可以忽略。
BrightFireOfCy 2014-07-03
  • 打赏
  • 举报
回复
最最方便有效的办法是,升级硬件
Tiger_Zhao 2014-07-01
  • 打赏
  • 举报
回复
关键多个 dm.KeyPress 是否有冲突。
如果它的多个实例之间会发生锁定、等待之类,那么肯定没有单个实例顺序调用的快。
layershow 2014-06-30
  • 打赏
  • 举报
回复
循环 50 次怎么会是 10 秒呢,你中间的处理到底有多慢,10秒 22 秒,差距太大,50次差个几毫秒是有可能的,差10秒,绝对是你代码的问题
a3212b12 2014-06-30
  • 打赏
  • 举报
回复
其实多线程也是每个线程轮着来的。线程间会相互影响的。这是我测试过的
落叶1210 2014-06-30
  • 打赏
  • 举报
回复
如果使用多线程所带来的效率增幅还比不上带来的开销,不建议使用多线程。
wenwen_esyuan 2014-06-30
  • 打赏
  • 举报
回复
谢谢前面所有的回答!这个问题可能和我调用的代码有关,如果我调用SLEEP,循环10次开一个线程和多个线程速度判别不大,但我测试中调用了大漠的插件,让大漠的插件只做一件事,就是上面的dm.KeyPress(122),按F11键一次,在实际测试中,正常开一个线程时按一次约30毫秒,如果开到5个线程,其中每个线程按一次约为90毫秒,这对一个事件影响可能不大,但如果我中间做好多件事时影响就特别明显了,比如按F12、F11、F10、F9、F8、F7.。。。。。,这样一个循环下来就可能差几秒了,这对一个程序来说是恐怖的,不知道为什么会速度影响这么大。而我看同样是别人的程序,不知道是怎么实现的,我用同样的代码,放到那个程序里面执行,结果像大家说的那样,开一个线程和多个线程影响不是很大(可能不是线程实现的,但都可以执行多次Button3.Click),可以忽略不计。百思不得其解!
threenewbee 2014-06-29
  • 打赏
  • 举报
回复
这是肯定的嘛。如果并发执行的线程增多,速度不变,那才奇怪呢。
wenwen_esyuan 2014-06-29
  • 打赏
  • 举报
回复
中间做什么不重要,只是用来延长一点时间用来计算时间差,我本来是用来监视游戏验证是否出现的,不影响上面的代码,什么都不做也可以,死循环是没办法的,因为我要长时间运行其中的动作,比如做一些打怪,监视等,运行多次是为了控制多个窗口。比如多个游戏,里面需要做同样的动作。所以不考虑清理资源问题,我手动停止就可以了。
  • 打赏
  • 举报
回复
给你提个醒:不要while,不要sleep。 如果你在那里死循环、阻塞,这种一股脑滥用资源从不让GC清理资源的做法好吗?
  • 打赏
  • 举报
回复
谁知道你的“中间所做的事”是在干什么呢?
wenwen_esyuan 2014-06-29
  • 打赏
  • 举报
回复
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Dim Thread1 As New System.Threading.Thread(New Threading.ParameterizedThreadStart(AddressOf 上面的循环)) Thread1.IsBackground = True Thread1.Start() End Sub 每按一次运行一个线程,按5次以后里面的循环速度就明显慢多了,有什么办法?郁闷好多天了!

16,555

社区成员

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

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