C#CPU使用过高,求大神

ken200344 2013-01-09 03:36:55
private void xianshiyanse()
{
int i = 0;
RECT rect = new RECT();
GetWindowRect(jubing, ref rect);
KeyboardHookLib.HookStruct hookStruct = new KeyboardHookLib.HookStruct();

tim.Interval = 1;
tim.Tick += delegate
{
i++;
if (i == 100)
{
System.Threading.Thread.Sleep(50);
GC.Collect();
i = 0;
}
if (pictureBox1.BackgroundImage != null)
{
pictureBox1.BackgroundImage.Dispose();
}
int x1 = rect.Left;
int y1 = rect.Top;
//Point P = new Point(x1, y1);
Point P = new Point(MousePosition.X, MousePosition.Y);
IntPtr h = GetDC(new IntPtr(0)); //指定坐标的句柄
int c = GetPixel(h, P);//取指定点色彩
int r = c % 256;
int g = (c / 256) % 256;
int b = c / 256 / 256;
try
{
pictureBox1.BackColor = Color.FromArgb(r, g, b);
}
catch
{
System.Threading.Thread.Sleep(100);
}
};
tim.Start();
}




加了这个的话就出现内存不足,CPU过高的现状,延迟还有释放都用上了,还是没作用
...全文
2899 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
year365 2013-01-14
  • 打赏
  • 举报
回复
看出楼主 的确是刚转。net开发 1.线程不是你那么用滴 2.GC 不是你这样管滴 3.代码片段里边最大的耗费资源的对象 你都没交代清除 4.业务流程也交代不清除 结果 就是 你这问题没法解决
fryhunter 2013-01-14
  • 打赏
  • 举报
回复
同楼上。windows下,你写个while(1){sleep(1);};看看。毫秒级调用,我只能说你的需求太bug了。这里用定时器还是另外开线程都一样。效果类似,不过相对而言,定时器,底层代码我没看过,如果用的是select或者alarm这样的技术,那么还涉及系统态与用户态的切换,相对可能更消耗性能。无论怎么样,你好歹调整下间隔时间。还有,那个什么GC.Collect();这个,在你掌握好C#的垃圾回收机制之前,还是别用为好,不要以为用了就带来性能提升,像你这样用,不过还好,这个命令并不是你调用就起作用,不然性能死得更惨。
Wasonzh 2013-01-13
  • 打赏
  • 举报
回复
16楼分析的不错,别外,GC.collect(),这种低级别的操作还是少用。除非你对GC及GC在你的程序里的实际应用效果非常了解。
xonln 2013-01-11
  • 打赏
  • 举报
回复
你不知NET就是吃内存和CPU吗??
莫聆 2013-01-10
  • 打赏
  • 举报
回复
1毫秒就要截取一次,确实太频繁了,另外,你的目的是什么,为什么要在定时器里获取鼠标点的位置,难道就不能考虑鼠标移动消息里获取嘛,另外这么频繁的操作过程,要尽量减少new的操作,尽量共用一个常用的对象。比如new Point,考虑挪到回调函数的外面,1毫秒new一个,内存回收根本跟不上。
裸奔在上海 2013-01-10
  • 打赏
  • 举报
回复
GC.Collect();这个还是不要调用了,你每次都强制回收内存,线程也是新建的 CPU都用在内存回收和整理上了,那还能响应别的请求?
noisu 2013-01-09
  • 打赏
  • 举报
回复
tim.Interval = 1; //数值弄大点 GC.Collect();//垃圾回收的太频繁了
风一样的大叔 2013-01-09
  • 打赏
  • 举报
回复
两个线程在一起定义初始化,一个负责计时,另一个就不要计时了
ken200344 2013-01-09
  • 打赏
  • 举报
回复
跪求大神
ken200344 2013-01-09
  • 打赏
  • 举报
回复
引用 11 楼 qiujialongjjj 的回复:
一毫秒就一个线程,当然死机,另一个别用timer写,也用线程
改用线程后一样出错了 private void xianshiyanse() { int i = 0; RECT rect = new RECT(); GetWindowRect(jubing, ref rect); KeyboardHookLib.HookStruct hookStruct = new KeyboardHookLib.HookStruct(); ss: i++; if (i == 100) { System.Threading.Thread.Sleep(50); GC.Collect(); i = 0; } if (pictureBox1.BackgroundImage != null) { pictureBox1.BackgroundImage.Dispose(); } int x1 = rect.Left; int y1 = rect.Top; //Point P = new Point(x1, y1); Point P = new Point(MousePosition.X, MousePosition.Y); IntPtr h = GetDC(new IntPtr(0)); //指定坐标的句柄 int c = GetPixel(h, P);//取指定点色彩 int r = c % 256; int g = (c / 256) % 256; int b = c / 256 / 256; try { pictureBox1.BackColor = Color.FromArgb(r, g, b); } catch { System.Threading.Thread.Sleep(100); } goto ss; } if (hookStruct.vkCode == 118) // 截获左win(开始菜单键) { IntPtr hwnd = GetForegroundWindow(); if (hwnd.ToString() != "0") { jubing = hwnd; //Imagecom(bm, bm1, mohuchenghu); Thread thread2 = new Thread(xianshiyanse); thread2.Start(); } } 出错的地方 Program.cs这个启动地方,提示内存不足,然后CPU暴增 Application.Run(new Form1());
风一样的大叔 2013-01-09
  • 打赏
  • 举报
回复
一毫秒就一个线程,当然死机,另一个别用timer写,也用线程
ken200344 2013-01-09
  • 打赏
  • 举报
回复
引用 9 楼 echo0808 的回复:
而且timer不会阻塞。。。
我怕起不到截色作用
echo0808 2013-01-09
  • 打赏
  • 举报
回复
而且timer不会阻塞。。。
echo0808 2013-01-09
  • 打赏
  • 举报
回复
tim.Interval = 500 试试
ken200344 2013-01-09
  • 打赏
  • 举报
回复
引用 4 楼 bdmh 的回复:
你这个根本没意义,用timer一样会阻塞,timer不是线程,你要用thread
小弟是新手,大神可以发个代码给小弟看看可以吗?
ken200344 2013-01-09
  • 打赏
  • 举报
回复
小弟是新手,大神可以发个代码给小弟看看可以吗?
memory_qian 2013-01-09
  • 打赏
  • 举报
回复
引用 2 楼 echo0808 的回复:
tim.Interval = 1 1毫秒一次。。。肯定高
那样设置多少啊
bdmh 2013-01-09
  • 打赏
  • 举报
回复
你这个根本没意义,用timer一样会阻塞,timer不是线程,你要用thread
ken200344 2013-01-09
  • 打赏
  • 举报
回复
这是个截鼠标颜色代码来的,请问这问大神有没有办法改进呢
echo0808 2013-01-09
  • 打赏
  • 举报
回复
tim.Interval = 1 1毫秒一次。。。肯定高
一、Go语言的由来      Go语言亦叫Golong语言,是由谷歌Goggle公司推出。Go语言的主要开发者有:肯.汤姆逊(Ken Thompson)、罗布.派克(Rob Pike)和罗伯特.格里泽默(Robert Griesemer)。这三个都是大神,稍介绍一下他们的贡献:     肯.汤姆逊(Ken Thompson):图灵奖得主,Uinx发明人,B语言作者(C语言前身),还做飞行员,后来被谷歌挖走。     罗布.派克(Rob Pike):Unix团队和Plan 9操作系统计划的成员,与Ken老爷子共事多年,并共创出广泛使用的UTF-8 字元编码。     罗伯特.格里泽默(Robert Griesemer):曾协助制作Java的HotSpot编译器,和Chrome浏览器的JavaScript引擎V8。     膜拜一下大神的容颜:Ken老爷子(左),Rob Pike(右)         二、开发Go语言的初衷     根据Go语言开发者自述,近10多年,从单机时代的C语言到现在互联网时代的Java,都没有令人满意的开发语言,而 C++往往给人的感觉是,花了100%的经历,却只有60%的开发效率,产出比太低,Java和C#的哲学又来源于C++。并且,随着硬件的不断升级,这些语言不能充分的利用硬件及CPU。因此,一门高效、简洁、开源的语言诞生了。 三、Go语言的特点    Go语言保证了既能到达静态编译语言的安全和性能,又达到了动态语言开发速度和易维护性,有人形容Go语言:Go = C + Python , 说明Go语言既有C静态语言程序的运行速度,又能达到Python动态语言的快速开发。 Go语言有以下特性: 1.自动垃圾回收     C/C++最头疼的就是指针问题,一不小心就野指针了或者又越界了。在Go语言里再也不用担心,也不用考虑delete或者free,系统自动会回收。 2.函数可以返回多个值     这个很神奇,大多数语言只能返回一个值,Go语言可以返回多个值。这个功能使得开发者再不用绞尽脑汁的想到底怎么返回值的设计,也不用为了传值专门定义一个结构体。 3.并发编程     Go语言天然并发,只需要关键字“go”就可以让函数并发执行,使得并发编程变得更为简单,这也是Go语言最大的优势。 四、Go语言能做什么开发     Go语言是非常有潜力的语言,是因为它的应用场景是目前互联网非常热门的几个领域,比如区块链开发、大型游戏服务端开发、分布式/云计算开发。像Goggle、阿里、京东等互联网公司都开始用Go语言开发自己的产品。

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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