我的一个实时监控程序一打开就死机。内存不够用。
Timer里不能加循环吗??
知道的在这个链接里也问答一下,我把这个帖子结了。
http://bbs.csdn.net/topics/391848699
private void timer1_Tick(object sender, EventArgs e)
{
for (int i = 210; i <= 850; i += 1)
{
for (int j = 320; j <= 500; j += 1)
{
Point ap = new Point(i, j);
IntPtr ahdc = GetDC(new IntPtr(0));
int ac = GetPixel(ahdc, ap);
if (ac == 255)
{
label1.text = "Error"
break;
}
}
}
}
------解决思路----------------------
你原来那贴不是有人说了,GetDC的结果要释放(ReleaseDC)
你不释放也可以,把代码移到最外面
IntPtr ahdc;
private void timer1_Tick(object sender, EventArgs e)
{
if(ahdc == IntPtr.Zero)
ahdc = GetDC(new IntPtr(0));
for(..........
}
------解决思路----------------------
1. 设置一个标志,避免前一Tick尚未完成时第二个又进来
2. 把GetDC提到循环外面去
3. GetDC要与ReleaseDC配对
4. break只跳出了一层循环,外层循环还会继续
private volatile bool _flag = false;
private void timer1_Tick(object sender, EventArgs e)
{
if(_flag) { return; }
_flag = true;
bool bBreak = false;
IntPtr ahdc = GetDC(new IntPtr(0));
for (int i = 210; i <= 850; i += 1)
{
if(bBreak) break;
for (int j = 320; j <= 500; j += 1)
{
if(bBreak) break;
Point ap = new Point(i, j);
int ac = GetPixel(ahdc, ap);
if (ac == 255)
{
label1.text = "Error"
bBreak = true;
}
}
}
ReleaseDC(ahdc);
_flag = false;
}
------解决思路----------------------
(850-210) * (500 -320) =115200,确定 这些事情,能在6秒内完成 ,而且,在这些循环内,WM_PAINT消息是无法被界面程序处理的。 你可以用线程,或让权(System.Windows.Forms.Application.DoEvent())函数来处理Windows 发送界面的消息。
------解决思路----------------------
最好多线程