神奇的代码,神奇的CPU占用率正弦曲线~
vb吧
全部回复
仅看楼主
level 6
ForeverBell 楼主
源C++代码来自《编程之美》~
现翻译成VB代码和吧友感受下编程的魅力~
Option Explicit    
   
Private Declare Function GetTickCount Lib "kernel32" () As Long    
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)    
   
Private Const SPLIT As Double = 0.01    
Private Const COUNT As Long = 200    
Private Const PI   As Double = 3.14159265    
Private Const INTERVAL   As Long = 300    
   
Sub Main()    
Dim busySpan(COUNT) As Long    
Dim idleSpan(COUNT) As Long    
Dim half As Long    
half = INTERVAL / 2    
Dim radian As Double    
Dim i As Long    
   
For i = 0 To COUNT - 1    
     busySpan(i) = half + (Sin(PI * radian) * half)    
     idleSpan(i) = INTERVAL - busySpan(i)    
     radian = radian + SPLIT    
Next i    
Dim starttime As Long    
Dim j As Long    
While (True)    
     j = j Mod COUNT    
     starttime = GetTickCount()    
     While (GetTickCount() - starttime <= busySpan(j))    
     Wend    
     Sleep (idleSpan(j))    
     j = j + 1    
Wend    
End Sub    
顺便附带上C++代码,让大家看下C++和VB代码的转换关系~
#include <windows.h>    
#include <stdlib.h>    
#include <math.h>    
   
const double SPLIT = 0.01;    
const int COUNT = 200;    
const double PI = 3.14159265;    

2009年08月18日 12点08分 1
level 6
ForeverBell 楼主
const int INTERVAL = 300;    
   
int main()    
{    
    DWORD busySpan[COUNT];    
    DWORD idleSpan[COUNT];    
    int half = INTERVAL / 2;    
    double radian = 0.0;    
    for (int i = 0; i < COUNT; i++)    
     {    
         busySpan[i] = (DWORD)(half + (sin(PI * radian) * half));    
         idleSpan[i] = INTERVAL - busySpan[i];    
         radian += SPLIT;    
     }    
        
    DWORD starttime = 0;    
    int j = 0;    
    while (true)    
     {    
         j = j % COUNT;    
         starttime = GetTickCount();    
         while (GetTickCount() - starttime <= busySpan[j]);    
         Sleep(idleSpan[j]);    
         j++;    
     }    
    return 0;    
}    
2009年08月18日 12点08分 2
level 6
沙个发
2009年08月18日 12点08分 3
level 6
ForeverBell 楼主
楼上惊现福娃囧囧~
2009年08月18日 12点08分 4
level 6
ForeverBell 楼主
顺便说一下,使用这份代码时,最好关掉其他可能会大幅度占用CPU的程序,否则会影响效果。
2009年08月18日 12点08分 5
level 0
哇,好漂亮~
2009年08月18日 12点08分 6
level 1
微软某年试题
2009年08月18日 12点08分 7
level 1
赛扬700没用啊....
2009年08月18日 12点08分 8
level 6
ForeverBell 楼主
双核需要SetThreadAffinityMask
2009年08月18日 12点08分 9
level 11
无效.
可能我的老机比较强壮一点
2009年08月18日 23点08分 10
1