cpu利用率的问题

refeiner 2008-04-29 09:37:38
在网上看了答案,自己改了一下,结果不是很满意
class Win32
{

[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern int SetThreadAffinityMask(IntPtr hWnd, int nIndex);
}

IntPtr nHD = new IntPtr(Thread.CurrentThread.ManagedThreadId);
Win32.SetThreadAffinityMask(nHD, 0x00000000);

const double SPLIT = 0.01;
const int COUNT = 200;
const double PI = 3.14159265;
const int INTERVAL = 300;//May be height

int[] busySpan = new int[COUNT];
int[] idleSpan = new int[COUNT];
int half = INTERVAL / 2;
double radian = 0.0;

for (int i = 0; i < COUNT; i++)
{
busySpan[i] = (int)((half + (Math.Sin(PI * radian) * half)));
idleSpan[i] = INTERVAL - busySpan[i];
radian += SPLIT;
}


int startTime = 0;
int j = 0;

while (true)
{
j = j % COUNT;
startTime = Environment.TickCount;
while ((Environment.TickCount - startTime) <= busySpan[j])
{

}
Thread.Sleep(idleSpan[j]);
j++;
}
结果:曲线很不好看,尽管是正弦了

问题
1、我用的是双核CPU,用一个死循环,可以让CPU稳定在50%左右,是为什么?
我猜测一个CPU管用户进程,另一个管着系统进程,但是后面用上面代码,两个CPU图都显示为正弦。。晕了
2、Win32.SetThreadAffinityMask(nHD, 0x00000000),让进程在第一个CPU上运行,但是不管我怎么调第二个参数,得到的结果都是一样的,WHY?
3、怎么样让曲线更回平滑?
上面的INTERVIAL也就是一个时间调度单位,在这个时间内,有一个忙和闲的比例。理论上说,
1)COUNT数值越大,randian越小,所得到的点就越多
2)INTERVAL时间越短,表示出的图样就越精细,在0~PI/2之间,INT值表示的比例在多大范围里面可以接受?比如: INTERVAL = 10,那么根本不可 能得到精确的点,但是INTERVAL越大,如2000MS那么图像就基本快没形状态
3)
while ((Environment.TickCount - startTime) <= busySpan[j])
{

}
执行busySpan[j]次,对应豪秒数是多少?sleep(idleSpan[i]),可是结结实实停了那么多豪秒,它们之间的比例还能准切吗?

各位大拿,多多发表看法~
...全文
128 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
浴火_凤凰 2008-04-30
  • 打赏
  • 举报
回复
继续学习中。
UltraBejing 2008-04-30
  • 打赏
  • 举报
回复
有点难度哦
jieao111 2008-04-29
  • 打赏
  • 举报
回复
d
源码链接: https://pan.quark.cn/s/d5c270d5abd6 依据所提供的文档资料,可以掌握若干有关VirtualBox COM对象获取无法成功的问题及其应对措施。 VirtualBox作为一款广受欢迎的开源虚拟化工具,能够让用户在当前运行的操作系统上建立及执行虚拟环境。 COM(Component Object Model)对象是应用于Windows平台的一种技术,旨在促成软件组件之间的交互。 若获取VirtualBox的COM对象遭遇失败,则意味着在与VirtualBox进行交互时遇到了某些障碍,这或许源于注册表设置存在偏差或某些组件未能正确部署。 此类问题的显现通常与安装Genymotion前需先安装VirtualBox有关,但在安装VirtualBox后却遭遇COM对象获取失败的情形。 这种情况可能会干扰VirtualBox的正常运作,使用户无法进行虚拟机的管理或构建。 解决方案包括若干步骤,其核心在于对Windows注册表的编辑操作。 注册表是Windows操作系统用于存储配置数据的数据库,其中包含了系统软件与硬件的配置详情,亦涵盖了COM对象的相关信息。 一旦COM对象的注册资料出现异常,系统便无法准确加载及执行相应的组件。 根据文件所载信息,处理方案包含以下环节:1. 在Windows环境中通过“regedit”指令启动注册表编辑器。 此步骤涉及在开始菜单的运行窗口中键入指令并执行。 2. 随后,依照文件中的指引,需要在注册数据库中定位特定的键值路径。 这些路径涵盖: - HKEY_CLASSES_ROOT\CLSID\{***-0000-0000-C000-***}\InprocServer32 - HKEY_CLASSES_ROOT\CLSID...
内容概要:本文介绍了一种基于局部高斯分布拟合能量驱动的活动轮廓模型,用于图像分割任务。该方法属于区域型主动轮廓模型,通过变分水平集方法实现轮廓演化,能够有效分割具有复杂边界或弱边界的图像目标。其核心思想是利用图像局部区域的灰度统计特性,构建基于高斯分布的能量函数,使轮廓在演化过程中对噪声具有较强鲁棒性,并能准确捕捉目标边缘。该模型特别适用于不均匀光照、低对比度等挑战性图像的分割场景,Matlab代码实现便于科研人员理解算法细节并进行二次开发。; 适合人群:具备一定图像处理基础,从事计算机视觉、医学图像分析、遥感影像处理等领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①解决传统边缘检测方法在噪声干扰下分割效果差的问题;②实现对灰度不均、边界模糊图像的精确分割;③为后续的图像识别、目标测量等任务提供高质量的分割结果;④作为学习水平集方法与主动轮廓模型的经典案例进行教学与研究。; 阅读建议:建议读者结合Matlab代码逐步调试运行,观察水平集函数的演化过程,深入理解能量泛函构造、梯度下降法求解及水平集更新机制,同时可尝试在不同类型的图像上测试算法性能并进行参数调优。

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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