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过高的现状,延迟还有释放都用上了,还是没作用
...全文
2908 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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毫秒一次。。。肯定高

111,094

社区成员

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

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

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