2012-03-05 2 views
3

Короче говоря, мне нужно разместить панель WinForms и экземпляр неуправляемого класса, который нарисовал его в отдельном потоке, чтобы обеспечить отзывчивость главного окна (SDK иногда может занять несколько секунд, чтобы придумать то, что он будет рисовать, и, хотя он делает это, он блокирует поток пользовательского интерфейса). Мне действительно нужно много из них (до 32), но сейчас мы поговорим об одном; концепция должна быть способна дублироваться столько раз, сколько необходимо.Создание нескольких циклов сообщений для вложенных элементов управления формы

Что я думаю, мне нужно сделать, это создать новую тему, которая будет «обновлять» панель, а затем запустить ApplicationContext, который не привязан ни к чему конкретно, и назначить его Panel. Затем класс Panel должен иметь перегрузку Dispose(), которая завершит ApplicationContext, выключив насос сообщений и завершив поток.

Что мне нужно знать:

  • Может быть помещена панель внутри IContainer, или добавлен в коллекцию Controls любого родительского объекта? Или, будет ли это делать, чтобы не быть потокобезопасными вызовами?
  • У меня есть статический заводский метод для класса, который создает новые экземпляры для новых потоков. Мне нужно вернуть ссылку на эту панель (созданную в фоновом потоке) из метода, чтобы я мог работать с ней. Есть ли лучший способ сделать это, чем ждать в течение короткого промежутка времени/цикла сна для переменной, определенной локально в статическом методе, который должен быть задан фоновым потоком?
  • Должен ли я содержать ссылку на тему, которая владеет панелью?
  • Неужели я сумасшедший для этого?

ответ

6

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

+3

+1: Это называется «offscreen compositing». Он используется большинством приложений, которые занимают некоторое время, чтобы загружать изображения, в то же время требуя, чтобы пользовательский интерфейс реагировал и мерцал. Это включает в себя все: от игровых движков до браузеров. – NotMe

+0

Хорошая идея; однако, я не думаю, что у меня есть эта роскошь. SDK ожидает использования HWnd, поэтому я уверен, что должен предоставить ему элемент GUI, известный Windows. – KeithS

Смежные вопросы