Создание путей в разных потоках и рендеринг на один и тот же холст - PullRequest
1 голос
/ 03 августа 2009

В настоящее время я работаю над системой WPF (с C # за кулисами), которая требует рендеринга данных из множества различных файлов. Большинство из этих файлов - документы AutoCAD. Каждый файл поставляется с набором данных, которые нам нужно нарисовать на экране по существу на одном и том же холсте. Думайте о каждом файле как о потенциальном «слое» или наложении, которое должно появиться на экране.

В настоящий момент каждый графический источник анализируется и преобразуется в набор Path объектов. Каждая коллекция путей отображается на собственном Canvas , так что его видимость может быть включена или выключена. Каждый из этих холстов сделан дочерним по отношению к родительскому холсту, к которому применен набор преобразований. Эти преобразования имеют базовое масштабирование и преобразуют преобразования рендеринга, которые используются для поддержки панорамирования и масштабирования просматриваемого изображения.

Эта функциональность в настоящее время работает нормально, но медленно. Мы визуализируем довольно много объектов Path на экране, и загрузка / создание этих экземпляров Path занимает довольно много времени.

Скорость загрузки сама по себе не является большой проблемой; на самом деле проблема в том, что мне нужно создавать экземпляры Path в потоке пользовательского интерфейса, в противном случае я не могу отобразить их все на одном холсте. Следовательно, во время загрузки весь пользовательский интерфейс блокируется , и пользователь ничего не может сделать.

Я много искал в Интернете, но, похоже, не могу найти решение этой проблемы. Я наткнулся на одну статью (к сожалению, у меня больше нет ссылки), в которой описан способ размещения элементов, созданных в разных потоках в одном окне . Это не сработало для меня вообще. Я попробовал комбинацию вещей, которые я нашел в статье, но у меня не получилось ничего визуализировать.

Так что, я думаю, суть моего вопроса такова: возможно ли создать набор объектов пользовательского интерфейса, в частности объектов Path, в разных потоках, затем загрузить их в родительский холст в основном потоке пользовательского интерфейса и заставить их все играть хорошо вместе? Будем весьма благодарны за любые ссылки, статьи или учебники.

Я с нетерпением жду вашей помощи! Спасибо за чтение.

OJ

Редактировать 1: Каждый из экземпляров Path представляет собой одну строку с цветом. Они не сложны. Но кажется, что создание самих этих объектов - это то, что занимает время (я могу ошибаться). Спасибо!

Ответы [ 3 ]

1 голос
/ 03 августа 2009

Одна из возможностей - создать PathGeometry (основную часть работы) в отдельном потоке, заморозить его и установить в Path, созданный в вашем потоке пользовательского интерфейса. (Я сам этого не делал, только читал об этом.)

Вот статья MSDN о замораживаемых объектах, из которых PathGeometry - единица, в которой говорится, что они могут совместно использоваться потоками (но больше не изменяться) после замораживания. Это может или не может соответствовать вашему сценарию.

0 голосов
/ 03 августа 2009

Просто идея. Что если вместо работы с объектами пользовательского интерфейса вы работаете с XAML? Это просто строка. Например, когда ваше приложение запускается, вы создаете фоновый поток (BackgroundWorker) для каждого файла. Фоновый рабочий читает файл и собирает XAML, в котором в качестве корневого элемента пользовательского интерфейса есть холст, а затем пути, сгенерированные из данных. Затем вы возвращаете этот XAML в виде строки обратно в поток пользовательского интерфейса. Затем поток пользовательского интерфейса использует метод XamlReader.Load для загрузки XAML и добавляет полученный объект холста в родительский холст. Вы даже можете создать элементы пользовательского интерфейса (дочерний холст и содержащиеся в нем пути) в рабочем потоке, а затем получить полученный XAML для возврата в основной поток.

0 голосов
/ 03 августа 2009

Используете ли вы Dispatcher on, который существует в каждом UIElement и предоставляет метод BeginInvoke для запуска кода в нужном потоке?

Читали ли вы эту статью MSDN: Создание более отзывчивых приложений с помощью Dispatcher

Модель потоков Windows Presentation Foundation описана здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...