1

我有一个包含这么多控件并执行大量交互操作的表单。这导致我的表格在使用过程中有一些延迟。其中一个控件是一个绘图工具,它可以绘制从我的服务器接收到的大量数据。我想把绘图工具移到另一个表单上,试图让我的表单更轻,减少延迟问题。一位朋友告诉我,这不会有太大帮助,因为它是处理两种形式的同一个线程,是真的吗?

4

3 回答 3

2

你朋友说的是真的,但在这里不太可能适用。当一个表单有很多控件时,它会显得迟钝。当它需要重绘自己时,您会开始注意到每个控件绘制自己所花费的时间。通常,当表单有大约 50 个控件时会发生这种情况,但这在很大程度上取决于控件的类型。例如,按钮非常昂贵,而标签则不然。您的情节可能很昂贵,因此在它之后绘制的任何内容(Z 顺序较高)都会被延迟。尝试右键单击控件并单击“置于最前面”,使其最后绘制。

无论你做什么,永远不要像你正在考虑的那样进行剧烈的改变,而不知道你会改进你的程序。这需要先测量。您需要一个分析器来了解 CPU 周期的消耗位置。分析绘画代码并不是那么容易,因为它不经常执行。这可以修复,修改您的表单构造函数,使其看起来像这样:

    public Form1() {
        InitializeComponent();
        Application.Idle += new EventHandler((s, ea) => this.Invalidate());
    }

您的表单现在燃烧 100% 核心,一遍又一遍地重新绘制自己。但在其他方面仍然完全正常。正是您有效分析绘画代码所需要的。

于 2012-07-28T12:04:47.170 回答
0

如果您在应用程序启动时创建表单(绘图工具容器),那么您的启动速度会下降......

那么你有两种方式:

1)将绘图工具容器移动到新表单,但在需要时创建它(在应用程序启动后)

2)将绘图工具移动到新线程。在这种情况下,您可以以另一种形式移动它并通过新线程创建它。所以如果你用这种方式你的启动速度会上升

于 2012-07-28T11:04:07.093 回答
0

这里给出的答案开始

我刚刚尝试了代码并稍作修改以使其更清晰:

static void Main()
{
    Thread t1 = new Thread(Main1);
    Thread t2 = new Thread(Main2);

    t1.Start();
    t2.Start();

    t1.Join();
    t2.Join();
}

static void Main1()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

static void Main2()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form2());
}

我可以说它有效,因为我尝试在其中一个中使用 Thread.Sleep() 并且第二种形式 gui 没有锁定。

于 2012-07-28T11:29:51.507 回答