当前位置: 代码迷 >> C# >> 帮忙看看这个程序,一打开就死机。错哪了
  详细解决方案

帮忙看看这个程序,一打开就死机。错哪了

热度:266   发布时间:2016-04-28 08:42:32.0
帮忙看看这个程序,一打开就死机。哪里错了?
我的一个实时监控程序一打开就死机。内存不够用。
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 发送界面的消息。
------解决思路----------------------
引用:
(850-210) * (500 -320) =115200,确定 这些事情,能在6秒内完成 ,而且,在这些循环内,WM_PAINT消息是无法被界面程序处理的。 你可以用线程,或让权(System.Windows.Forms.Application.DoEvent())函数来处理Windows 发送界面的消息。

最好多线程
  相关解决方案