Timer内使用循环的一个程序,时间长了就死机。请帮忙看看?

myvvc 2015-10-26 04:06:57
刚开始运行还行,然后循环一次的时间越来越长。打开资源管理器,发现程序内存越来越大,最后就跑不动了。
请帮忙看看是什么情况。
我这个是隔5秒实时确认一次的,是timer用的不对吗?还是循环有问题?
学习中,请帮帮忙。谢谢!
}
private void button1_Click(object sender, EventArgs e)
{
timer1.Interval=5000;
timer1.start();
}

private void timer1_Tick(object sender, EventArgs e, string asd)
{
picturebox1.Visable = false;
picturebox2.Visable = false;
for (i=1; i<10; i++)
{
for(j=1; j<5; j++ )
{
c = G(i, j); //通过函数,由i,j计算出c值
if (c==d)
{
picturebox1.Visable = true;
break;
}
else
{
picturebox2.Visable = true;
}
}
}
...全文
1004 点赞 收藏 16
写回复
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
qbilbo 2015-10-28
别在循环中去GetDC,在每次判断前把那个区域的图像复制出来,去判断内存中的那张图,速度会快很多。我试下来每次判断100毫秒左右。 代码见另一帖
回复
南天空 2015-10-26
我试了一下,你的timer只有开始计时,没有结束,在你的事件处理逻辑结束后加上timer停止命令
private void Form1_Load(object sender, EventArgs e)
{
Timer mytimer = new Timer();
mytimer.Start();
mytimer.Stop();

}
回复
myvvc 2015-10-26
引用 10 楼 myvvc 的回复:
[quote=引用 6 楼 zhanxueguang 的回复:] 使用 GetDC 获得句柄,计算了此point 的象素后, 是否释放了?
这个可能是问题所在,我看了一些帖子说timer是多线程不能释放。 如果这样的话,像这种需要实时监控的必须释放才行吧?! 你说的GetDC具体怎么使用?是加到timer1_Tick事件结尾,if判断后使用这个?那picturebox.Visable不就是效了?[/quote] 我的意思是释放命令怎么用?谢谢!
回复
myvvc 2015-10-26
引用 11 楼 xdashewan 的回复:
你能发可执行的代码,我感觉你发的这代码你自己都没执行过,就直接甩包给别人了?
可以执行。
回复
myvvc 2015-10-26
引用 9 楼 shingoscar 的回复:
[quote=引用 7 楼 myvvc 的回复:] [quote=引用 4 楼 shingoscar 的回复:] picturebox1.Visable = false; 你的代码真的能跑起来吗?
能,如果不设成false显示会有点问题。[/quote] pictureBox只有Visible属性,你这通篇都是Visable,这是变异了的pictureBox吗?[/quote] 不好意思,我用note写的,这个电脑没vs。
回复
xdashewan 2015-10-26
你能发可执行的代码,我感觉你发的这代码你自己都没执行过,就直接甩包给别人了?
回复
myvvc 2015-10-26
引用 6 楼 zhanxueguang 的回复:
使用 GetDC 获得句柄,计算了此point 的象素后, 是否释放了?
这个可能是问题所在,我看了一些帖子说timer是多线程不能释放。 如果这样的话,像这种需要实时监控的必须释放才行吧?! 你说的GetDC具体怎么使用?是加到timer1_Tick事件结尾,if判断后使用这个?那picturebox.Visable不就是效了?
回复
Poopaye 2015-10-26
引用 7 楼 myvvc 的回复:
[quote=引用 4 楼 shingoscar 的回复:] picturebox1.Visable = false; 你的代码真的能跑起来吗?
能,如果不设成false显示会有点问题。[/quote] pictureBox只有Visible属性,你这通篇都是Visable,这是变异了的pictureBox吗?
回复
Poopaye 2015-10-26
还有Timer_Tick怎么会有个字符串参数
回复
myvvc 2015-10-26
引用 4 楼 shingoscar 的回复:
picturebox1.Visable = false; 你的代码真的能跑起来吗?
能,如果不设成false显示会有点问题。
回复
Rajesh_James 2015-10-26
使用 GetDC 获得句柄,计算了此point 的象素后, 是否释放了?
回复
myvvc 2015-10-26
引用 2 楼 xdashewan 的回复:
你这i和j怎么看着像全局的变量,这样会导致如果一次执行超过5秒,那么后面的循环会十分混乱,有可能导致无限循环最后耗尽内存
不好意思,int i,j是定义在private void timer1_Tick事件里面的,忘写到上面代码里了。
回复
Poopaye 2015-10-26
picturebox1.Visable = false; 你的代码真的能跑起来吗?
回复
myvvc 2015-10-26
引用 1 楼 zhanxueguang 的回复:
把你的 G这个函数贴出来看看
是获得坐标颜色的一组函数,计算出c以后,直接和目标值d比较。 Point p = new Point(i, j); IntPtr hdc = GetDC(new IntPtr(0)); int c = GetPixel(hdc, p);
回复
xdashewan 2015-10-26
你这i和j怎么看着像全局的变量,这样会导致如果一次执行超过5秒,那么后面的循环会十分混乱,有可能导致无限循环最后耗尽内存
回复
Rajesh_James 2015-10-26
把你的 G这个函数贴出来看看
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.