Используйте поток пользовательского интерфейса приложения WPF для выполнения длительной задачи обработки элемента пользовательского интерфейса, а также для обновления индикатора выполнения в том же окне. - PullRequest
0 голосов
/ 15 сентября 2009

Моя программа состоит из большого графического элемента управления пользовательского интерфейса, который мне нужно тратить около 15 секунд, перезагружая время от времени. Поскольку код обновления работает главным образом с элементом управления UI (возможно, 90% его фактически задает свойства элемента управления), для меня будет иметь смысл фактически позволить потоку UI обрабатывать это. Я действительно не хочу, чтобы элемент управления визуально перерисовывал, когда он загружается в отдельном потоке от пользовательского интерфейса.

Я также хочу обновить индикатор выполнения, который находится в строке состояния того же окна приложения. Есть ли способ нарушить правило в этом случае и перерисовать только индикатор выполнения, или я должен просто открыть новое окно приложения для индикатора выполнения, чтобы жить в нем?

Что бы вы сделали в этом конкретном случае?

Ответы [ 4 ]

2 голосов
/ 15 сентября 2009

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

Основной шаблон:

  1. Вызовите вашу основную задачу, передавая нулевой шаг.
  2. Выполните шаг.
  3. Если есть больше шагов, поставьте в очередь другое сообщение, передавая шаг + 1.

Затем вы можете добавлять текущие обновления в соответствующие пункты вашего кода.

PS. Не сказать, что это ваш лучший вариант - трудно сказать, не зная всех деталей. Но это вариант.

1 голос
/ 15 сентября 2009

Это не совсем верно, что в приложении есть только один поток пользовательского интерфейса , просто большинство приложений Windows когда-либо создают объекты пользовательского интерфейса только в одном потоке, поэтому этот поток становится "потоком" приложение. Легко понять почему - это делает код более простым для понимания и защищает нас от неявных проблем связывания потоков между элементами управления.

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

0 голосов
/ 15 сентября 2009

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

0 голосов
/ 15 сентября 2009

Найдите графический элемент управления UI, который является более эффективным. Если поток пользовательского интерфейса не вернется к циклу сообщений, никаких других обновлений не произойдет (и это замедлит обновления вашего элемента управления графиком).

...