| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5589 人关注过本帖
标题:关于VB对于系统资源的使用
只看楼主 加入收藏
renxiaoyao36
Rank: 9Rank: 9Rank: 9
来 自:七宝中学
等 级:贵宾
威 望:31
帖 子:347
专家分:1077
注 册:2014-9-18
结帖率:92.31%
收藏
已结贴  问题点数:20 回复次数:17 
关于VB对于系统资源的使用
近日写了一个程序,这个程序里面有大量的计算,计算量远超我之前的程序。运行的时候发现一个奇怪的现象:即使我的程序已经卡爆了,但是任务管理器里CPU使用率不超过15%
仔细看发现,程序开始运算时,有一个核的CPU使用率飙升到75%左右,但是其他CPU内核无反应。关闭程序后,该核立刻恢复到3%-5%。
在此我想请教一下各位,VB的程序是不是默认只分配一个CPU的内核呢?如果是,如何让程序可以使用多核呢?


在网上查找的资料都是关于设定程序在哪个CPU核心上运行的,没有提到如何让程序使用多个CPU核心,因此只好求助于各位了

[此贴子已经被作者于2016-5-24 18:29编辑过]

搜索更多相关主题的帖子: 网上 如何 资源 任务管理器 
2016-05-24 18:26
xiangyue0510
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:86
帖 子:941
专家分:5244
注 册:2015-8-10
收藏
得分:4 
这个没有研究过,但是确实有可能对多核支持很差,可以考虑用Matlab等编程计算,VB调用即可
2016-05-24 19:00
ZHRXJR
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:125
帖 子:1034
专家分:5519
注 册:2016-5-10
收藏
得分:4 
VB60是早期产品,那个时期CPU可能还没有多核产品,因此估计只能支持单核运行,不过没有研究过,VB2008以上产品是否可以支持多核。

请不要选我!!!
2016-05-24 19:17
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:4 
VB6 ,是天生的单线程,所以有运算都是在一个线程中完成。
也许你在任务管理器中看到 VB6 写的程序用了3个,甚至6个线程,那些线程是控件带的线程,不是VB6所能操作。

因为VB6写的程序天生是单线程,所以运算负荷重时,只有一个核会满载,也就是说如果是 4核CPU,CPU占用率永远不会超过 25%。
如果你的计算可以分解成几个部分,那可以去使用多线程,网上已有稳定多线程的方法了。
详情见:VB6多线程技术超详细示例(纯API) by秋枫萧萧(百度ID:hhyjq007)
尊重版权,这里就不上传了。

注意:VB6自带的控件及变量统统是 线程非安全 ,一定要小心,否则程序崩了找不到原因的。



[此贴子已经被作者于2016-5-24 19:45编辑过]


授人于鱼,不如授人于渔
早已停用QQ了
2016-05-24 19:37
xiangyue0510
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:86
帖 子:941
专家分:5244
注 册:2015-8-10
收藏
得分:0 
回复 4楼 风吹过b
呢。我用的时候还真没有注意过
2016-05-24 20:07
hjxlj
Rank: 10Rank: 10Rank: 10
来 自:江西
等 级:贵宾
威 望:14
帖 子:292
专家分:1519
注 册:2013-6-25
收藏
得分:4 
如果你的程序是单线程的,再多的核又有什么用?

本人QQ:775420425
2016-05-24 21:14
renxiaoyao36
Rank: 9Rank: 9Rank: 9
来 自:七宝中学
等 级:贵宾
威 望:31
帖 子:347
专家分:1077
注 册:2014-9-18
收藏
得分:0 
好吧,谢谢各位的帮助,我上网搜索一下,也谢谢风版给我的帮助。

[此贴子已经被作者于2016-5-25 21:12编辑过]


编程蛋疼的不是枯燥,而是辛辛苦苦编完几百行的代码,运行,“Runtime Error “xxx””。
2016-05-25 18:23
renxiaoyao36
Rank: 9Rank: 9Rank: 9
来 自:七宝中学
等 级:贵宾
威 望:31
帖 子:347
专家分:1077
注 册:2014-9-18
收藏
得分:0 
我想了一下,决定吧我现在程序的源代码发上来(以前没接触过多线程,看网上资料一脸懵逼,决定从代码本身出发,以降低资源消耗量的方式来达成目标)
我这个程序是一个小游戏,屏幕上出现300-1000的点(视难度而定),这些点会朝你所控制的大点袭来,你要躲避他们

这一段是每个点的移动算法,请各位大大帮忙改善一下,谢谢!
代码处于计时器当中,计时器的Inyerval值为50
程序代码:
Private Sub Timer1_Timer()
For i = 0 To JValue 'JValue为当前点的数量,所有点都是一个控件数组里的
If Abs(Shape1.Top - Shape(i).Top) < 100 And Abs(Shape1.Left - Shape(i).Left) < 100 Then
Open App.Path & "\高分榜\" & Replace(Replace(Replace(Replace(Speed, "1000", "VeryDifficult.sav"), "300", "Middle.sav"), "600", "Difficult.sav"), "100", "Easy.sav") For Input As #1
Input #1, a
Close #1
If a > Time Then
MsgBox "你死了!游戏结束!未破纪录。分数:" & CStr(Time): Debug.Print i: Timer1.Enabled = False: Unload Form2: Form1.Show: Exit Sub
Else
Open App.Path & "\高分榜\" & Replace(Replace(Replace(Replace(Speed, "1000", "VeryDifficult.sav"), "300", "Middle.sav"), "600", "Difficult.sav"), "100", "Easy.sav") For Output As #1 '输出分数,REPLACE函数负责模式检测
Print #1, Time
Close #1
MsgBox "你死了!游戏结束!你的分数是最高纪录!分数:" & CStr(Time): Debug.Print i: Timer1.Enabled = False: Unload Form2: Form1.Show: Exit Sub
End If
End If
Movement = Abs(Shape1.Left - Shape(i).Left) / Abs(Shape1.Top - Shape(i).Top) '计算移动比例
Debug.Print Movement
If Shape1.Left > Shape(i).Left Then
  Shape(i).Left = Shape(i).Left + 20
ElseIf Shape1.Left < Shape(i).Left Then
  Shape(i).Left = Shape(i).Left - 20
End If
On Error Resume Next
If Movement = 0 Then Movement = 1
If Shape1.Top > Shape(i).Top Then
  Shape(i).Top = Shape(i).Top + 20 / Movement
ElseIf Shape1.Top < Shape(i).Top Then
  Shape(i).Top = Shape(i).Top - 20 / Movement
End If

Next i
End Sub

在100到150点的时候并不卡顿,但是到200点以上明显卡顿,当1000点的时候已经慢到极致了。
各位能帮我改善一下么,谢谢啦

[此贴子已经被作者于2016-5-25 21:17编辑过]


编程蛋疼的不是枯燥,而是辛辛苦苦编完几百行的代码,运行,“Runtime Error “xxx””。
2016-05-25 21:16
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
你这段代码需要优化。
首先,坐标不要直接从属性里取,而是定义一个数组,然后操作数组。
操作属性是很慢的操作。
其次,动画,不要操作控件来生成,而应该自己画图。操作控件是非常慢的操作。
动画不闪的话,可以使用 二次缓冲来实现。

你说一下你的程序流程吧。
点是怎么移动的?
按大点当前位置的坐标,每次移动多少位置?速度是随机还是固定?
还是按随仙方向,固定速度或随机速度移动。



授人于鱼,不如授人于渔
早已停用QQ了
2016-05-26 17:03
renxiaoyao36
Rank: 9Rank: 9Rank: 9
来 自:七宝中学
等 级:贵宾
威 望:31
帖 子:347
专家分:1077
注 册:2014-9-18
收藏
得分:0 
回复 9楼 风吹过b
速度固定,这在代码里可以看出
每次固定横坐标+10,纵坐标根据移动比例计算,移动比例在代码中有计算公式
根据移动计算方式,小的点会沿直线向大点移动过去

绘图对于程序的影响可以忽略不计,因为我另外一段代码没发上来,发上来想必你就明白了。
程序代码:
Private Sub Form_Load()
Form1.Height = Screen.Height: Form1.Width = Screen.Width
If Difficulty = 1 Then
Speed = 100: Me.Caption = Me.Caption & "简单"
ElseIf Difficulty = 2 Then
Speed = 300: Me.Caption = Me.Caption & "普通"
ElseIf Difficulty = 3 Then
Speed = 600: Me.Caption = Me.Caption & "困难"
ElseIf Difficulty = 4 Then
Speed = 1000: Me.Caption = Me.Caption & "爆炸难度"
End If
Timer1.Interval = 10
MouseX = Screen.Width / 2
MouseY = Screen.Height
Dim i As Integer
For i = 1 To Speed Step 1 '循环加载部件
sss:
On Error Resume Next
Load Shape(i): Shape(i).Left = 40000 * Rnd: Shape(i).Top = 20000 * Rnd: Shape(i).FillColor = Shape(0).FillColor: Shape(i).BorderColor = Shape(0).BorderColor: Shape(i).Height = 135: Shape(i).Width = 135: Shape(i).Visible = True: Shape(i).Shape = 3
If Shape(i).Left < MouseX + 1000 And Shape(i).Left > MouseX - 1000 Then GoTo sss
If Shape(i).Top < MouseY + 1000 And Shape(i).Top > MouseY - 1000 Then GoTo sss '防止生成在鼠标附近
Next i
Me.WindowState = 2
SetCursorPos ScaleX((Screen.Width / 2), 1, 3), ScaleY((Screen.Height / 2), 1, 3) '移动鼠标位置  
Debug.Print Screen.Width
Debug.Print Screen.Width / 2
Timer1.Enabled = True
JValue = Speed
Time = -1
End Sub
Private Sub Timer2_Timer()
For i = JValue To JValue + 30
sss:
On Error Resume Next
Load Shape(i): Shape(i).Left = 40000 * Rnd: Shape(i).Top = 20000 * Rnd: Shape(i).FillColor = Shape(0).FillColor: Shape(i).BorderColor = Shape(0).BorderColor: Shape(i).Height = 135: Shape(i).Width = 135: Shape(i).Visible = True: Shape(i).Shape = 3
If Shape(i).Left < MouseX + 1000 And Shape(i).Left > MouseX - 1000 Then GoTo sss
If Shape(i).Top < MouseY + 1000 And Shape(i).Top > MouseY - 1000 Then GoTo sss '防止生成在鼠标附近
Next i
JValue = JValue + 30
End Sub

Timer2的Interval为5000
这段代码主要是在加载窗体时加载小的点,同时移动鼠标坐标,控制大的点的代码如下:
程序代码:
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
MouseX = x
MouseY = y
Shape1.Left = x - 100
Shape1.Top = y - 100
End Sub


坐标不要直接从属性里取,而是定义一个数组,然后操作数组。

意思是不是在加载点的时候将点的初始坐标写入数组,然后每次都调用数组?
这样的话每次移动小点的步骤将会多很多啊,个人认为不能解决代码速度的问题,反而可能更加慢

还是感谢风版的帮助,如果有空的话再助小弟一臂之力如何?我也会仔细思考如何优化代码的。

[此贴子已经被作者于2016-5-26 18:56编辑过]


编程蛋疼的不是枯燥,而是辛辛苦苦编完几百行的代码,运行,“Runtime Error “xxx””。
2016-05-26 18:54
快速回复:关于VB对于系统资源的使用
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035166 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved