首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

优化代码 减低CPU使用

2012-08-08 
优化代码 降低CPU使用下面这代码怎么了,一运行就占用40%多到50%的CPU,要如何优化,,,,VB codePrivate Sub d

优化代码 降低CPU使用
下面这代码怎么了,一运行就占用40%多到50%的CPU,要如何优化,,,,

VB code
Private Sub delay(HaoMiao As Double)    Dim t1 As Long    t1 = timeGetTime '记下开始的时间    While (timeGetTime - t1) < HaoMiao    DoEvents '让 windows 去处理其他事    WendEnd SubPrivate Sub yunxing()  Dim x As Integer  Dim rc As RECT               For x = 1 To ListView1.ListItems.Count                    '延时,单位毫秒      delay ListView1.ListItems(x).ListSubItems(4)  '第5列为 点击间隔              If ListView1.ListItems(x).ListSubItems(8) = "运行" Then                  '------------------------------               '分解 ListView1.ListItems(X).ListSubItems(7) 得出坐标               Dim s, xx, yy As String               s = ListView1.ListItems(x).ListSubItems(7)               s = Mid(s, 2, Len(s) - 2)               xx = Left(s, InStr(s, ",") - 1)               yy = Right(s, Len(s) - InStr(s, ","))               '------------------------------                If ListView1.ListItems(x).ListSubItems(6) = "按下左键" Then                    If ListView1.ListItems(x).ListSubItems(5) = "前台" Then                        GetWindowRect ListView1.ListItems(x).ListSubItems(3), rc                        SetCursorPos rc.Left + xx, rc.Top + yy                        mouse_event &H2, 0, 0, 0, 0 '按下鼠标左键                    Else                           ppt = yy * &H10000 Or xx '鼠标坐标                          PostMessage ListView1.ListItems(x).ListSubItems(3), &H201, 0&, ByVal ppt             '按下鼠标左键                    End If                '-------------------------                ElseIf ListView1.ListItems(x).ListSubItems(6) = "释放左键" Then                    If ListView1.ListItems(x).ListSubItems(5) = "前台" Then                        GetWindowRect ListView1.ListItems(x).ListSubItems(3), rc                        SetCursorPos rc.Left + xx, rc.Top + yy                        mouse_event &H4, 0, 0, 0, 0 '释放鼠标左键                    Else                      ppt = yy * &H10000 Or xx                      PostMessage ListView1.ListItems(x).ListSubItems(3), &H202, 0&, ByVal ppt             '释放鼠标左键                    End If                End If      End If     Next x         End Sub


[解决办法]
While (timeGetTime - t1) < HaoMiao
DoEvents '让 windows 去处理其他事
Wend
[解决办法]
其实楼主可以不用管它
Windows是多任务的操作系统,你在VB中使用了DoEvents,它的意思就是在系统有其它任务需要处理时,就将CPU资源释放给需要处理的任务,在没有任务时,本进程是占用CPU资源的,所以表面上CPU占用率是比较高的。但你不用担心会导致系统“死机”的情况出现。

此外,如果你一定要降低CPU的占用率,那么可以使用API函数Sleep来代替延迟,这个函数就是将本进程挂起指定的时间(ms),但会导致被挂起的进程停止执行,也就是出现“假死”现象。

出于以上两个的特点,你可以结合两者来处理:
Sleep 10
DoEvents
这样,挂起进程10ms,在检查一下Windows中有无需要CPU资源的进程,这样可以适当降低CPU的占用率


总而言之,我觉得,代码中有循环是肯定要占用高CPU资源的,要降低CPU的占用率,最好的办法就是少用长时间循环
[解决办法]
Do
DoEvents
If ((timeGetTime - t1) > HaoMiao) Then Exit Do
Loop
[解决办法]
VB code
Private Sub delay(HaoMiao As Double)    Dim t1 As Long    t1 = timeGetTime '记下开始的时间    While (timeGetTime - t1) < HaoMiao        DoEvents '让 windows 去处理其他事        Sleep 1    WendEnd Sub
[解决办法]
假设不加入Sleep 1,那么你的等待循环将以CPU能达到的最高速度来运行.

实际上这个循环仅仅是为了不断检测经过的时间是否达到设定的时间而已,不需要如此高的速度去检测,所以加入Sleep 1,将检测速度限制到每秒1000次以内,甚至可以用更高的Sleep时间,让检测速度进一步下降,比如Sleep 50,以不影响程序的响应为准.

由于这种方式会严重降低循环的执行速度,所以不适用于循环处理数据的情况,因为会严重降低性能.

热点排行