C#:当我尝试移动窗口,单击外部或最小化窗口时,窗口挂起

阿迪尔

这是我尝试运行的应用程序的图片:

在此处输入图片说明

当我尝试在外部单击,移动或最小化它时,窗口将挂起:

在此处输入图片说明

我的代码:

        public void Process()
    {
        //            using (HalconDotNet.HWindowControl HWinCtrl = new HalconDotNet.HWindowControl())
        //            {
        using (PitFinderEngine VisionEngine = new PitFinderEngine())
        {

            foreach (string jpegfile in JpegFiles)
            {
                try
                {
                    string[] parts1 = jpegfile.Split('\\');
                    string[] parts2 = parts1[parts1.Length - 1].Split('.')[0].Split('_');
                    string row = parts2[parts2.Length - 2].Split('R')[1];
                    string col = parts2[parts2.Length - 1].Split('C')[1];
                    Results.Add(row + " " + col, VisionEngine.action(jpegfile, "Production"));
                    //FormControls.ProgressBar_DoStep();
                }
                catch (Exception e)
                {

                }
            }

        }
    }

以这种方式调用“过程”:

    public static Thread StartTheThread(string LN, string TN)
    {
        var t = new Thread(() => RealStart(LN, TN));
        t.Start();
        return t;
    }

    private static void RealStart(string ln, string tn) {
            Lots[ln].Tiles[tn].Process();

    }


    public static void DoWork()
    {
        string[] Directories = Directory.GetDirectories(LotPictureFolder);
        List<Thread> ThreadList = new List<Thread>();
        foreach (string lot in Directories)
        {
            string[] parts = lot.Split('\\');
            string LotName = parts[parts.Length - 1];
            foreach (string tile in Lots[LotName].Tiles.Keys)
            {
                if (!Lots[LotName].Tiles[tile].VicFileFound)
                {
                    ThreadList.Add(StartTheThread(LotName, tile));
                }

            }
        }

        bool AllDone = false;
        while (!AllDone)
        {
            AllDone = true;
            foreach (Thread th in ThreadList)
            {
                if (th.IsAlive)
                {
                    AllDone = false;
                }
            }
        }
    }

看起来

VisionEngine.action(jpegfile, "Production")

如果我要移动窗户,则需要10毫秒-20毫秒才能运行,并负责吊起窗户;意思是,如果我将其注释掉,问题将不复存在,是否有可能隔离此代码,我尝试使用线程,但问题仍然存在,因为平台是.Net3.5,所以我无法使用任务。

哥达德

问题在于,当您为应用程序运行更长的任务时,它会阻塞UI直到完成命令。这是因为您的任务阻止了MainThread该订单,因此UI无法响应,因为它也正在运行MainThread因为UIWindows不响应,所以它告诉您:嘿,监视此窗口当前不响应任何用户操作。

即使您的应用程序在后台做了很多事情(您分配应用程序要做的事情),但这对用户和Windows都没有关系。问题在于,一旦您在应用程序上单击更多,被阻止的UIWindows仍会注意到该情况并建议您关闭窗口,因为该应用程序似乎卡住了。

只需在长时间运行的任务中使用Application.DoEvents()其行为如下:

调用此方法会使当前线程在处理所有等待窗口消息时挂起。

因此,它暂停了您当前正在长时间运行的任务,以处理来自例如用户输入的Windows消息,从而最大化,移动,...窗口。之后,它将继续处理您的长期订单。

Application.DoEvents();

这意味着,例如,如果您的方法需要10秒钟才能完成,则调用Application.DoEvents()一次会使您的应用程序仅处理用户操作一次,这似乎不是您想要的行为。因此,您必须多次调用它。请注意,这会使您的运行方法明显变慢。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在此窗口外部单击时,如何禁用自动最小化窗口?我正在使用Xubuntu 14.04

当我单击任务栏上的图标时,聚焦窗口不会最小化(Windows 10)

为什么当我最小化html中的窗口形状时?

当我最小化最后一个窗口时,为什么我的计算机崩溃?

防止窗口最小化

JavaFX如何最小化ImageView上的单击窗口?

如何通过单击最小化打开的窗口?

映射“Super+ArrowDown”以在窗口聚焦且窗口未全屏时最小化窗口

最小化浏览器窗口时尝试使徽标粘贴

最小化窗口时HTML视频暂停

最小化Kivy窗口时如何运行功能

Tkinter-在使用任何小部件之前最大化和最小化窗口,当我使用它们时将其隐藏

最小化模式窗口时最小化所有应用程序窗口(在Linux上)

如何使用目标C最小化Mac中的窗口?

批处理-运行循环命令时最小化窗口(不最小化启动)

C#最小化的窗口未通过调用System.Diagnostics.Process.GetProcesses()返回

如何通过C#最小化远程桌面连接(RDC)窗口?

以编程方式最小化所有窗口或我的Cocoa应用程序之外的窗口?

当我尝试在执行过程中退出窗口或当我点击窗口时,Pygame 窗口没有响应

如何防止最小化父窗口关闭子窗口

如何从Java最小化JFrame窗口?

如何取消最小化硒窗口?

Pygame强制窗口最小化

如何捕获窗口最小化事件?

恢复最小化窗口的命令

OSX bash最小化窗口

最小化窗口的快捷方式

无法以编程方式最小化窗口

防止窗口最小化或关闭