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


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

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

搜索更多相关主题的帖子: 网上 如何 资源 任务管理器 
2016-05-24 18:26
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
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
renxiaoyao36
Rank: 9Rank: 9Rank: 9
来 自:七宝中学
等 级:贵宾
威 望:31
帖 子:347
专家分:1077
注 册:2014-9-18
收藏
得分:0 
回复 11楼 风吹过b
风版事实上不需要那么麻烦再替我写个工程的,我只是需要一点建议,我可不是什么伸手党,您这样反而会让我过意不去的……真是麻烦了……
另外,您的工程我看了一下,借鉴作用有,但是不算很大。您的工程的算法有些不大一样,同时也没有解决我最重要的问题:程序卡顿问题
我把我的工程源文件发上来吧,您如果不嫌麻烦的话看一下吧,测试一下我的工程,看一下程序结果,然后在此基础上提一点加快程序运行速度的建议吧

我不是对您的方案否定,只是您的方案不适合我罢了……

以下是源文件
小游戏.zip (5.33 KB)

编程蛋疼的不是枯燥,而是辛辛苦苦编完几百行的代码,运行,“Runtime Error “xxx””。
2016-05-27 17:42
renxiaoyao36
Rank: 9Rank: 9Rank: 9
来 自:七宝中学
等 级:贵宾
威 望:31
帖 子:347
专家分:1077
注 册:2014-9-18
收藏
得分:0 
谢谢,我立刻去试试看

编程蛋疼的不是枯燥,而是辛辛苦苦编完几百行的代码,运行,“Runtime Error “xxx””。
2016-05-28 07:52
renxiaoyao36
Rank: 9Rank: 9Rank: 9
来 自:七宝中学
等 级:贵宾
威 望:31
帖 子:347
专家分:1077
注 册:2014-9-18
收藏
得分:0 
14L的方案测试过了,注销Debug语句后在编译环境中速度略微快了一点,但是依然会在150个点以上时卡顿
Next i语句前加了Doevents,解决了大的点的闪烁问题
移动距离更换为15后,基本没有影响,个人认为是因为我有一句代码已经注定了不可能让移动距离为整数:
程序代码:
If Movement = 0 Then Movement = 1
If Shape1.Top > Shape(i).Top Then
  Shape(i).Top = Shape(i).Top + 15 / Movement
ElseIf Shape1.Top < Shape(i).Top Then
  Shape(i).Top = Shape(i).Top - 15 / Movement


我最近思考得出了一点结果,我觉得导致程序速度不佳的一个原因很可能是在Timer1里面:
我使用了For循环,而For循环是在一个Timer里的,这就导致随着点的增多,Timer的运行速度会越来越慢。
个人解决方案:编写一个算法,判定当点的数量大于X时,启用某个Timer,就是每个Timer仅仅处理50个点的移动。
但是算法还没想出来,正在努力思考中,先把我的想法发上来,如果大家发现我的想法有误也可以即使告诉我,让我不用在岔路上越走越远。

编程蛋疼的不是枯燥,而是辛辛苦苦编完几百行的代码,运行,“Runtime Error “xxx””。
2016-05-28 08:05
renxiaoyao36
Rank: 9Rank: 9Rank: 9
来 自:七宝中学
等 级:贵宾
威 望:31
帖 子:347
专家分:1077
注 册:2014-9-18
收藏
得分:0 
谢谢大家的帮助,我先把帖子结了,到时候另外启一个帖子继续讨论吧

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



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

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