Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 函数导致屏幕闪烁冻结_C#_Winforms_Timer_Pixel_Overloading - Fatal编程技术网

C# 函数导致屏幕闪烁冻结

C# 函数导致屏幕闪烁冻结,c#,winforms,timer,pixel,overloading,C#,Winforms,Timer,Pixel,Overloading,我有一个并不复杂的函数,但由于某种原因,每次我调用它时,它都会使屏幕冻结四分之一秒。这个功能是在一个计时器上,每秒钟部署一次,所以它会让用户非常恼火 该函数基本上获取屏幕截图,通过比较10个像素来检查它正在查找的屏幕,如果是屏幕,则返回true,否则返回false: ClassName.CheckScreen(CaptureScreen(),ClassName.Pxarr1); //Capture screen isn't the problem. It gave me no freezes i

我有一个并不复杂的函数,但由于某种原因,每次我调用它时,它都会使屏幕冻结四分之一秒。这个功能是在一个计时器上,每秒钟部署一次,所以它会让用户非常恼火

该函数基本上获取屏幕截图,通过比较10个像素来检查它正在查找的屏幕,如果是屏幕,则返回true,否则返回false:

ClassName.CheckScreen(CaptureScreen(),ClassName.Pxarr1); //Capture screen isn't the problem. It gave me no freezes in an endless loop.
这就是课堂:

class ClassName
{
    public static Pixel[] Pxarr1 = new[]
    {
        new Pixel(Color.FromArgb(255, 204, 204, 170), new Point(15, 145)),
        new Pixel(Color.FromArgb(255, 221, 204, 187), new Point(20, 460)),
        new Pixel(Color.FromArgb(255, 221, 204, 187), new Point(20, 545)),
        new Pixel(Color.FromArgb(255, 204, 187, 170), new Point(15, 150)),
        new Pixel(Color.FromArgb(255, 221, 204, 187), new Point(22, 190)),
        new Pixel(Color.FromArgb(255, 204, 204, 187), new Point(25, 540)),
        new Pixel(Color.FromArgb(255, 204, 187, 153), new Point(22, 61)),
        new Pixel(Color.FromArgb(255, 221, 204, 170), new Point(23, 563)),
        new Pixel(Color.FromArgb(255, 204, 187, 153), new Point(23, 47)),
        new Pixel(Color.FromArgb(255, 204, 204, 187), new Point(23, 463)),

    };

    public static Pixel[] Pxarr2 = new[]
    {
        new Pixel(Color.FromArgb(255, 221, 255, 119), new Point(80, 120)),
        new Pixel(Color.FromArgb(255, 51, 119, 221), new Point(180, 525)),
        new Pixel(Color.FromArgb(255, 204, 170, 85), new Point(630, 455)),
        new Pixel(Color.FromArgb(255, 85, 153, 17), new Point(707, 177)),
        new Pixel(Color.FromArgb(255, 255, 153, 34), new Point(520, 440)),
        new Pixel(Color.FromArgb(255, 255, 238, 51), new Point(150, 325)),
        new Pixel(Color.FromArgb(255, 0, 85, 255), new Point(455, 70)),
        new Pixel(Color.FromArgb(255, 255, 221, 51), new Point(685, 285)),
        new Pixel(Color.FromArgb(255, 17, 17, 17), new Point(547, 369)),
        new Pixel(Color.FromArgb(255, 170, 170, 136), new Point(500, 545)),

    };

    public static Pixel[] Pxarr3 = new[]
    {
        new Pixel(Color.FromArgb(255, 238, 238, 238), new Point(353, 223)),
        new Pixel(Color.FromArgb(255, 28, 33, 49), new Point(428, 198)),
        new Pixel(Color.FromArgb(255, 85, 85, 85), new Point(462, 314)),
        new Pixel(Color.FromArgb(255, 221, 221, 238), new Point(450, 450)),
        new Pixel(Color.FromArgb(255, 102, 102, 102), new Point(384, 349)),
        new Pixel(Color.FromArgb(255, 204, 204, 204), new Point(406, 248)),
        new Pixel(Color.FromArgb(255, 221, 221, 221), new Point(464, 453)),
        new Pixel(Color.FromArgb(255, 255, 204, 17), new Point(413, 198)),
        new Pixel(Color.FromArgb(255, 204, 204, 204), new Point(343, 447)),
        new Pixel(Color.FromArgb(255, 255, 255, 255), new Point(403, 457)),

    };

    public static Pixel[] Pxarr4 = new[]
    {
        new Pixel(Color.FromArgb(255, 204, 170, 136), new Point(120, 227)),
        new Pixel(Color.FromArgb(255, 221, 187, 153), new Point(502, 170)),
        new Pixel(Color.FromArgb(255, 119, 85, 34), new Point(692, 243)),
        new Pixel(Color.FromArgb(255, 238, 221, 187), new Point(211, 169)),
        new Pixel(Color.FromArgb(255, 187, 170, 136), new Point(272, 238)),
        new Pixel(Color.FromArgb(255, 170, 153, 119), new Point(696, 64)),
        new Pixel(Color.FromArgb(255, 136, 85, 17), new Point(306, 242)),
        new Pixel(Color.FromArgb(255, 187, 170, 119), new Point(115, 236)),
        new Pixel(Color.FromArgb(255, 204, 187, 153), new Point(310, 183)),
        new Pixel(Color.FromArgb(255, 153, 102, 34), new Point(647, 245)),

    };

    public static Pixel[] Pxarr5 = new[]
    {
        new Pixel(Color.FromArgb(255, 255, 238, 221), new Point(376, 150)),
        new Pixel(Color.FromArgb(255, 255, 238, 221), new Point(376, 350)),

        new Pixel(Color.FromArgb(255, 255, 238, 221), new Point(506, 150)),
        new Pixel(Color.FromArgb(255, 255, 238, 221), new Point(506, 350)),

        new Pixel(Color.FromArgb(255, 255, 238, 221), new Point(246, 150)),
        new Pixel(Color.FromArgb(255, 255, 238, 221), new Point(246, 350))
    };

    public static bool CheckScreen(Bitmap img, Pixel[] samples)
    {
        int verifiedpixels = 0;
        for (int i = 0; i < samples.Length; i++)
        {
            Color c = img.GetPixel(samples[i].Location.X, samples[i].Location.Y);
            if (c == samples[i].Color)
                    verifiedpixels++;
        }
        return verifiedpixels >= (samples.Length * 0.6);
    }

}
类名
{
公共静态像素[]Pxarr1=新[]
{
新像素(颜色来自argb(255、204、204、170),新点(15、145)),
新像素(颜色来自argb(255、221、204、187),新点(20460)),
新像素(颜色来自argb(255、221、204、187)、新点(20545)),
新像素(颜色来自argb(255204187170),新点(15150)),
新像素(颜色来自argb(255、221、204、187),新点(22190)),
新像素(颜色来自argb(255204204187),新点(25540)),
新像素(颜色来自argb(255、204、187、153),新点(22、61)),
新像素(颜色来自argb(255、221、204、170)、新点(23563)),
新像素(颜色来自argb(255、204、187、153),新点(23、47)),
新像素(颜色来自argb(255204204187),新点(23463)),
};
公共静态像素[]Pxarr2=新[]
{
新像素(颜色来自argb(255、221、255、119)、新点(80、120)),
新像素(颜色来自argb(255,51,119,221),新点(180,525)),
新像素(颜色来自argb(255、204、170、85),新点(630、455)),
新像素(颜色来自argb(255,85,153,17),新点(707177)),
新像素(颜色来自argb(255、255、153、34),新点(520、440)),
新像素(颜色来自argb(255、255、238、51),新点(150、325)),
新像素(颜色来自argb(255,0,85,255),新点(455,70)),
新像素(颜色来自argb(255,255,221,51),新点(685285)),
新像素(颜色来自argb(255,17,17,17),新点(547369)),
新像素(颜色来自argb(255、170、170、136),新点(500、545)),
};
公共静态像素[]pxar3=新[]
{
新像素(颜色来自argb(255,238,238,238),新点(353,223)),
新像素(颜色来自argb(255,28,33,49),新点(428,198)),
新像素(颜色来自argb(255,85,85,85),新点(462314)),
新像素(颜色来自argb(255、221、221、238)、新点(450450)),
新像素(颜色来自argb(255、102、102)、新点(384、349)),
新像素(颜色来自argb(255、204、204)、新点(406、248)),
新像素(颜色来自argb(255、221、221、221)、新点(464、453)),
新像素(颜色来自argb(255,255,204,17),新点(413198)),
新像素(颜色来自argb(255、204、204)、新点(343、447)),
新像素(颜色为argb(255,255,255,255),新点(403457)),
};
公共静态像素[]pxar4=新[]
{
新像素(颜色来自argb(255、204、170、136),新点(120、227)),
新像素(颜色来自argb(255、221、187、153)、新点(502170)),
新像素(颜色来自argb(255、119、85、34),新点(692、243)),
新像素(颜色来自argb(255、238、221、187)、新点(211、169)),
新像素(颜色来自argb(255187170136),新点(272238)),
新像素(颜色来自argb(255、170、153、119),新点(696、64)),
新像素(颜色来自argb(255、136、85、17),新点(306、242)),
新像素(颜色来自argb(255187170119),新点(115236)),
新像素(颜色来自argb(255、204、187、153),新点(310、183)),
新像素(颜色来自argb(255、153、102、34),新点(647、245)),
};
公共静态像素[]pxar5=新[]
{
新像素(颜色来自argb(255、255、238、221)、新点(376150)),
新像素(颜色来自argb(255、255、238、221)、新点(376、350)),
新像素(颜色来自argb(255、255、238、221)、新点(506150)),
新像素(颜色来自argb(255、255、238、221)、新点(506350)),
新像素(颜色来自argb(255、255、238、221)、新点(246、150)),
新像素(颜色来自argb(255、255、238、221),新点(246350))
};
公共静态布尔检查屏幕(位图img,像素[]示例)
{
int-verifiedpixels=0;
for(int i=0;i=(samples.Length*0.6);
}
}
注意:使用CaptureScreen()时,100循环for语句的速度是使用文件中的图像时的两倍。 (4秒对2秒)

但是,我仍然不明白为什么这个函数会导致任何冻结,即使是来自文件的图像。

和SetPixel()的速度非常慢

使用另一种方法,如LockBits()/UnlockBits()技术。请参见和SetPixel()的速度非常慢


使用另一种方法,如LockBits()/UnlockBits()技术。请参见

因为您使用的是计时器,所以它不应该冻结UI,除非您使用的是将在UI线程上执行其回调的计时器。而是使用或。
System.Timers.Timer
示例:

private System.Timers.Timer _checkPixelsTimer=新系统.Timers.Timer()


编辑:更新代码以预览如何在UI线程调用函数。

由于您使用的是计时器,因此不应冻结UI,除非您使用的是将在UI线程上执行其回调的计时器。而是使用或。
System.Timers.Timer
示例:

private System.Timers.Timer _checkPixelsTimer=新系统.Timers.Timer()


编辑:更新代码以预览如何在UI线程调用函数。

GetPixel变慢是已知事实吗?还是你也遇到过这个?这是个秘密
public Form1()
{
    InitializeComponents();

    _checkPixelsTimer.Intervla = 1000;//one second
    _checkPixelsTimer.AutoReset = true;
    _checkPixelsTimer.Elapced += OnCheckPixelsTimerElapced;
    _checkPixelsTimer.Start();
}

private void OnCheckPixelsTimerElapced(object sender, System.Timer.ElapcedEventArgs e)
{
    if (ClassName.CheckScreen(CaptureScreen(),ClassName.Pxarr1))
    {
        MethodInvoker method = new MethodInvoker(() => { /*code that relays on the UI thread */ });
        if (this.InvokeRequired)
        {
            this.Invoke(method); 
        }
        else
        {
            method();
        }
    }
}