0

我接手了一个键盘挂钩项目,并对其进行了一些修饰。过去只有 4 个表格,在这 4 个文件中包含所有逻辑和数学。很多小时后,我在将所有内容解耦后才将程序重新组合在一起。最新的一点是在主窗口上使用 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);
   }
}

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

4

1 回答 1

1

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

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

于 2013-04-03T19:14:23.640 回答