![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 25.06.2013
Сообщений: 14
|
![]()
Возможно ли реализовать приложение следующим образом. Есть главное окно. Внутри него имеются другие окна (или контролы),
жестко прикрепленые ("докируемые") друг с другом. Важно, что эти дочерние окна запущенны каждый в своем потоке, и соответственно со своим диспетчером, т.е обработка данных в окнах происходит параллельно. Идеально, чтобы это все было полностью на WPF. Ну или хотябы сами окна (контролы) на WPF. Ну если и так невозможно, то скажите как по другому. Я знаю по-отдельности: 1)Как запустить WPF окно в собственном потоке. 2) Как поместить в грид WPF содержимое другого окна. НО. Вместе это не работает Просьба написать хотя бы возможно или нет и, если да, то как. |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
|
![]()
Не надо разных диспетчеров, это лишнее.
Просто обработку данных ведите в разных потоках, и все. Почти уверен, что это ваш случай: http://www.gunsmoker.ru/2008/10/x-y-z.html Задачу-то изначальную расскажите
Благодарить в репутацию. Проклинать — туда же
![]() |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 25.06.2013
Сообщений: 14
|
![]()
Данные обрабатываются в нескольких отдельных потоках.
Результат обработки этим потокам нужно выводить в окно. При этом данные могут изменяться достаточно часто, но нужно, чтобы была сохранена очередность, в которой данные на форме изменились. При этом логически есть разные объекты вывода. Сейчас это в виде контролов в одном окне. Invoke работает ну очень медленно. BeginInvoke несколько быстрее, но все равно медленно, плюс там нарушается очередность выполнения, когда несколько "писателей" (потоков) как в моем случае. И в обоих случаях обновляется содержимое окна тормознуто. Дополнительные (вспомогательные) окна я создаю в отдельных потоках, со своими диспетчерами и это работает хорошо. Вот я и подумал, что было бы здорово, чтобы то что в контролах у меня на главном окне, как в отдельных окнах обрабатывалось. |
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
|
![]()
А через Binding не проще? Вывод через Invoke в контролы wpf изначально не очень хорошая затея
Если поделитесь информацией что за контролы и какого рода данные вы в них выводите, то могу попробовать более конкретное предложение высказать )
Благодарить в репутацию. Проклинать — туда же
![]() Последний раз редактировалось Luuzuk; 26.11.2015 в 18:02. |
![]() |
![]() |
![]() |
#5 | |
Пользователь
Регистрация: 25.06.2013
Сообщений: 14
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
|
![]()
1) Вычислительный поток складывает результаты своей работы в, допустим, некоторый List<TResult>. Никаких оповещений не вызывает
2) Работающий DispatcherTimer раз в N времени вызывает PropertyChanged 2.1) Если использовать Binding религиозные убеждения не позволяют, то таймер может эти результаты на форму выводить и "напрямую", т.е. через View.textBox1.Text="someshit" 3) Если хранить результаты вычислений в листе постоянно вы не хотите, то прямой путь к неблокирующим потокобезопасным коллекциям типа ConcurrentQueue<TResult>. Тогда в таймере раз в N времени будете извлекать из очереди результаты работы вычислительного потока, скажем, пачками по 10-20 результатов, и эти результаты отображать на UI. Таким образом вы обеспечите и упорядоченность обработки результатов (потокобезопасная очередь это обеспечит), и поток вычислений не будете загружать ненужной ему работой по отображению результатов на UI Как вам такая затея?
Благодарить в репутацию. Проклинать — туда же
![]() |
![]() |
![]() |
![]() |
#7 | |
Пользователь
Регистрация: 25.06.2013
Сообщений: 14
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
|
![]()
А их не надо ОЧЕНЬ часто обновлять, в том-то и вся фишка. Пользователю не надо 100500 обновлений UI в секунду, вы же с такой скоростью читать (глазами) данные с экрана не сможете )
Обновление раз в 0.5-1 секунды вас разве чем-то не устроит? При условии, что в контролы попадут все результаты, которые в течение этой секунды были получены от вычислительного потока. А частоту обновления можно очень легко регулировать интервалом таймера
Благодарить в репутацию. Проклинать — туда же
![]() Последний раз редактировалось Luuzuk; 26.11.2015 в 19:12. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
найти все дочерние окна или объекты окна. | ромик0 | Win Api | 5 | 23.11.2012 16:12 |
Дочерние окна | vovik4385 | Общие вопросы C/C++ | 3 | 05.10.2012 22:37 |
Дочерние окна | Jrcfyf | C# (си шарп) | 1 | 30.03.2012 14:01 |
закрыть все дочерни окна, кроме главного окна | Worms | Общие вопросы Delphi | 2 | 03.12.2007 22:18 |
Как сделать чтобы дочерние окна в MDI-приложениях были вне главного окна??? | dimonchuk | Общие вопросы Delphi | 1 | 11.08.2007 12:13 |