代码之家  ›  专栏  ›  技术社区  ›  OJ.

在不同线程上创建路径并渲染到同一画布

  •  1
  • OJ.  · 技术社区  · 15 年前

    我目前正在开发一个WPF(在后台使用C)系统,它需要从许多不同的文件中呈现数据。这些文件大多是AutoCAD文档。每个文件都有一组数据,我们需要在屏幕上基本上绘制在同一画布上。把每个文件想象成一个潜在的“层”或者需要出现在屏幕上的覆盖层。

    目前,每个图形源都被解析并转换为一组 Path 物体。每个路径集合都呈现给它自己的 Canvas 这样就可以打开或关闭它的可见性。每个画布都是父画布的子画布,父画布上应用了一组转换。这些转换是基本的缩放和转换渲染转换,用于支持正在查看的图像的平移和缩放。

    此功能目前工作正常,但速度较慢。我们在屏幕上呈现了相当多的路径对象,加载/创建这些路径实例需要相当长的时间。

    加载速度本身并不是什么大问题;真正的问题是我需要在UI线程上创建路径实例,否则我无法在同一画布上呈现所有实例。因此,加载时, 整个用户界面被锁定 用户无法做任何事情。

    我在网上搜索了很多,但似乎找不到解决这个问题的方法。我确实偶然发现了一篇文章(不幸的是,我已经没有链接了),它描述了在同一个线程上托管在不同线程上创建的项目的方法。 窗口 . 这对我根本不起作用。我尝试了一系列我在文章中找到的东西,但是我什么都无法呈现。

    因此,我想我的问题的关键是:是否可以在不同的线程上创建一组UI对象,特别是路径对象,然后将它们加载到主UI线程的父画布中,并让它们一起很好地进行播放?任何参考资料、文章或教程都将受到极大的赞赏。

    我期待着您的帮助!谢谢你的阅读。

    OJ

    编辑1: 每个路径实例都只是一条带颜色的单行。它们并不复杂。但似乎这些物体本身的创造是需要时间的(我可能错了)。谢谢!

    3 回复  |  直到 15 年前
        1
  •  1
  •   Ben M    15 年前

    一种可能是在单独的线程上创建路径几何体(大部分工作),冻结它,并将其设置为在UI线程上创建的路径。(我自己没做过,只是读了一下。)

    这里是一个 MSDN article 在可冻结对象上,其中pathgeometry是一个对象,它声明一旦冻结,可以跨线程共享这些对象(但不再修改)。这可能适合也可能不适合您的场景。

        2
  •  0
  •   Mitch Wheat    15 年前

    你用的是 Dispatcher 它存在于每个ui元素上,并提供 BeginInvoke 在正确的线程上运行代码的方法?

    您是否阅读过此msdn文章: Build More Responsive Apps With The Dispatcher

    描述了Windows演示文稿基础线程模型 here .

        3
  •  0
  •   Mehmet Aras    15 年前

    只是一个想法。如果不处理UI对象,而是使用XAML,该怎么办?它只是一根绳子。例如,当应用程序启动时,为每个文件生成一个后台线程(backgroundworker)。后台工作人员读取文件,并将画布作为根UI元素的XAML和从数据生成的路径放在一起。然后将该XAML作为字符串返回到UI线程。然后,UI线程使用XamlReader.Load方法加载XAML,并将生成的画布对象添加到父画布。甚至可以在工作线程上创建UI元素(子画布及其包含的路径),然后获取生成的XAML以返回到主线程。