我如何配置ShowDialog
本文关键字:配置 ShowDialog 何配置 | 更新日期: 2023-09-27 18:07:20
我接手了一个键盘钩子项目,并一直在整理它。过去只有4个表单,在这4个文件中包含了所有的逻辑和数学。所以许多小时后,在解耦一切后,我刚刚把程序重新组装起来。最新的一点是在主窗口上使用模型-视图-演示者的设计概念。我所有的测试都在我的机器上运行得很好,程序在目标计算机上的运行也很正常。
目标计算机是具有2gb内存的简单x86 Intel Atom处理器。它们上面有与键盘上的F13-F18相关的按钮(这就是我的键盘挂钩程序发挥作用的地方)。我的开发PC是一台半坚固的6核AMD x64机器,内存为8gb。我想做的一件事是测试一种将这些Function按钮设置为特定任务的方法。这部分的所有单元测试都通过了。当我点击一个新的任务类型时,它会按预期工作。
"酷",我说,"让我们看看它在行动",所以我在Visual Studio中运行。在我的程序中,F9-F12是键钩。现在,分配窗口只有在主窗口打开时按下其中一个钩形键时才会打开。如果主窗口未打开,则执行任务。所以我打开我的主窗口,按F9,分配窗口显示,但我不能点击任何东西大约4秒。然后它就会"赶上"我,做我点的任何事情。我想也许是我的调试器,所以我去了bin文件夹,直接运行应用程序,同样的处理。
我想也许这是一个权限的事情,所以我运行作为管理员和同样的问题。我想知道它在目标电脑上会有多糟糕。我把我的bin文件夹复制到一个闪存驱动器上,把内容复制到Program Files中,然后运行它。它工作得很好(在某种程度上很好),但问题并不存在。我可以在对话框显示后立即选择我想要的任何任务。
一个奇怪的事情是,虽然我的键盘钩子停止工作后11次尝试重新分配它…但这是另一个问题。我记得有人说过,用侧写师。我的visual studio有一个,所以我打开了它,但我不能对返回的数据做出正面或反面的判断。我想写代码,但我不知道该写什么。我甚至在我认为有问题的地方使用了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);
}
}
所以我被卡住了。我不知道该打什么,该问什么。关于如何找到这个问题的根源,有什么建议吗?
我在使用winforms开发的一个应用程序中遇到了类似的问题——"服务器端"操作非常快,但是显示结果的表单仍然需要5秒才能显示出来。
经过调查,发现winforms有一些已知的性能问题。这里有一些优化建议(比如这里或这里,还有一些我当时发现的,但现在似乎找不到)。
事实上,在我的情况下,他们都没有帮助。
我最终意识到真正的瓶颈是创建和显示一个新表单;我最终做的是一个小hack——
我把所有控件都放在主窗体上,其中一些隐藏起来,并通过隐藏一些控件和显示其他控件来模拟窗体的变化。
它很丑,不能扩展,但在我的例子中运行得很好。