如何配置 ShowDialog?

Posted

技术标签:

【中文标题】如何配置 ShowDialog?【英文标题】:How do I profile ShowDialog? 【发布时间】:2013-04-03 18:37:03 【问题描述】:

我接手了一个键盘挂钩项目,并对其进行了一些改进。过去只有 4 个表格,在这 4 个文件中包含所有逻辑和数学。所以 MANY 小时后,我只是在将所有内容解耦后将程序重新组合在一起。最新的一点是在主窗口上使用 Model-View-Presenter 设计概念。我所有的测试都在我的机器上运行良好,程序自然而然地在目标计算机上运行。

目标计算机是具有 2gb 内存的简单 x86 Intel Atom 处理器。它们上有与键盘上的 F13-F18 相关的按钮(这是我的键盘挂钩程序发挥作用的地方)。我的开发 PC 是半坚固的 6 核 AMD x64 机器,具有 8GB 内存。我想做的一件事是测试一种将这些功能按钮设置为特定任务的方法。我所有的单元测试都通过了这部分。当我单击新任务类型时,它会按需要工作。

“酷”,我说,“让我们看看它的实际效果”,所以我在 Visual Studio 中运行。我的程序 F9-F12 是挂钩的关键。现在,只有在主窗口打开时按下其中一个挂钩键时,分配窗口才会打开。如果该主窗口未打开,则执行任务。所以我打开我的主窗口并按 F9 并显示分配窗口,但我无法单击任何内容大约 4 秒。然后它“赶上”并执行我点击的操作。我想这可能是我的调试器,所以我去了 bin 文件夹并直接运行应用程序并进行同样的处理。

我认为这可能是权限问题,所以我以管理员身份运行并遇到同样的问题。我想知道它在目标计算机上会有多糟糕。我将 bin 文件夹复制到闪存驱动器,将内容复制到 Program Files 并运行它。它工作得很好(在一定程度上很好)但问题不存在。在对话框可见后,我可以立即选择我想要的任何任务。

一个奇怪的事情是,虽然我的键盘挂钩在尝试重新分配 11 次后停止工作......但这是一个单独的问题。所以我想我记得有人说,使用分析器。好吧,我的视觉工作室有一个,所以我打开了它,但我无法确定返回的数据的正面或反面。我会发布代码,但我不知道该发布什么。我什至在我认为有问题的区域使用System.Console.Write(".");,但这不是问题

protected override void theHook_RegisteredKeyPressed(System.Windows.Forms.Keys key)

    if (TakeOver)
    
        if (!Busy)
        
            busy = true;
            LibraryTrace.Start("NewKeyAssignment", key);
            using (var window = new AssignmentTypePanel())
            
                presenter = new TaskPresenter(window, theList[key].Task);
                window.Presenter = presenter;
                //execution will not continue past here until window is closed
                window.ShowDialog();
            
            theList[key] = new TaskKey(key, presenter.Task);
            LibraryTrace.End("NewKeyAssignment", theList[key].Task.ToString());
            busy = false;
        
   
   else
   
       base.theHook_RegisteredKeyPressed(key);
   

所以我被困住了。我不知道要输入什么,要问什么。关于如何找到这个问题的根源的任何提示?

【问题讨论】:

预感我将所有目标平台设置为 x86,但问题仍然存在.. :/ 该程序有 7MB 内存占用。 (就是TaskManager说它只用了7mb)而程序本身只有1.1mb。奇怪的是所有组件如何自己工作良好,但不能很好地协同工作 【参考方案1】:

我在使用 winforms 开发的应用程序中遇到了类似的问题——“服务器端”操作非常快,但显示结果的表单仍然需要大约 5 秒才能显示出来。 经调查,winforms 存在一些已知的性能问题。 有一些优化建议(如here 或here 以及我当时发现但现在似乎无法找到的其他一些建议)。

实际上,它们对我的情况都没有帮助。 我最终意识到真正的瓶颈是创建和显示一个新表单。我最终做的有点像 hack- 我将所有控件放在主窗体上,其中一些是隐藏的,并通过隐藏一些控件并显示其他控件来模拟窗体的变化。 它很丑陋,不会扩大规模,但在我的情况下效果很好。

【讨论】:

有趣的想法。我觉得很奇怪,我的所有测试都通过了,我遇到了这么多问题。如果我打开一个表单来手动分配一个键(来自单元测试)它工作得很好。我一直试图缩小问题所在。我要疯了。我想我会在另一个项目上工作一天,看看是否有帮助。

以上是关于如何配置 ShowDialog?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ShowDialog() 时如何使用打开的表单?

如何从 ShowDialog 返回 IObservable<DialogResult>

Flutter showDialog 如何刷新 setStatus

如何以 ShowDialog() 形式打开表单;我第一次打开表单但 Show();我第二次打开同一个表格

wpf ShowDialog或者其他操作后 UI不动 最小化再次最大化后又恢复正常

使用 form.ShowDialog() 时,主窗体中的线程不起作用