【问题标题】:Docking a form that is on a separate UI thread停靠在单独的 UI 线程上的表单
【发布时间】:2013-09-17 09:17:04
【问题描述】:

我已经有代码来创建一个主窗体,并创建一个带有自己的消息泵的“子”窗体。目前子窗体完全独立于主窗体。

我想将子窗体停靠在父窗体中,以便移动/调整大小/等父窗体也会影响子窗体。最简单或最好的方法是什么?我知道通常你会停靠一个控件,但单独的消息泵需要一个窗口。

至于我这样做的原因:主窗体有多个图形控件,当图形变得复杂时,在一个线程上绘制所有这些控件会变慢。如果不将每个图形的绘制分解成自己的线程,我就无法进一步提高性能。我相信这是使用多个 UI 线程有效的少数情况之一?

【问题讨论】:

  • 与父表单相比,您孩子的相对位置和矩形是多少?当然,这应该用一些屏幕截图来描述。
  • 在另一个线程上显示表单在 Winforms 中已经非常存在问题,当 SystemEvents 类在错误的线程上触发其事件时会导致严重问题。许多控件订阅了 UserPreferenceChanged 事件。通过尝试停靠这样一个需要与父级消息传递的窗口,您为自己挖了一个更深的洞。不要这样做。
  • @HansPassant 那我应该放弃吗?你能想到任何不涉及单独 UI 线程的解决方案吗?我们计划迁移到 WPF,这有望为这个问题提供更好的解决方案,但我真的可以同时使用解决方案。
  • 不存在任何合理的情况,即图表需要如此多的时间来绘制自己,以至于您需要如此激烈的 hack。显示器上没有足够的像素。当然,真正的问题是您将太多数据塞入其中。当然 WPF 也不能解决这个问题。

标签: c# .net multithreading winforms


【解决方案1】:

经过一些实验,这似乎是不可能的。

尝试设置子级的Parent 会导致异常'在一个线程上创建的控件不能作为另一个线程上的控件的父级。'

【讨论】:

    猜你喜欢
    • 2012-11-06
    • 2015-10-22
    • 2011-06-02
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 2011-04-17
    相关资源
    最近更新 更多