|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
26.11.2015, 15:41 | #1 |
Пользователь
Регистрация: 25.06.2013
Сообщений: 14
|
Дочерние окна со своим потоком внутри главного
Возможно ли реализовать приложение следующим образом. Есть главное окно. Внутри него имеются другие окна (или контролы),
жестко прикрепленые ("докируемые") друг с другом. Важно, что эти дочерние окна запущенны каждый в своем потоке, и соответственно со своим диспетчером, т.е обработка данных в окнах происходит параллельно. Идеально, чтобы это все было полностью на WPF. Ну или хотябы сами окна (контролы) на WPF. Ну если и так невозможно, то скажите как по другому. Я знаю по-отдельности: 1)Как запустить WPF окно в собственном потоке. 2) Как поместить в грид WPF содержимое другого окна. НО. Вместе это не работает Просьба написать хотя бы возможно или нет и, если да, то как. |
26.11.2015, 16:21 | #2 |
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
|
Не надо разных диспетчеров, это лишнее.
Просто обработку данных ведите в разных потоках, и все. Почти уверен, что это ваш случай: http://www.gunsmoker.ru/2008/10/x-y-z.html Задачу-то изначальную расскажите
Благодарить в репутацию. Проклинать — туда же
|
26.11.2015, 16:48 | #3 |
Пользователь
Регистрация: 25.06.2013
Сообщений: 14
|
Данные обрабатываются в нескольких отдельных потоках.
Результат обработки этим потокам нужно выводить в окно. При этом данные могут изменяться достаточно часто, но нужно, чтобы была сохранена очередность, в которой данные на форме изменились. При этом логически есть разные объекты вывода. Сейчас это в виде контролов в одном окне. Invoke работает ну очень медленно. BeginInvoke несколько быстрее, но все равно медленно, плюс там нарушается очередность выполнения, когда несколько "писателей" (потоков) как в моем случае. И в обоих случаях обновляется содержимое окна тормознуто. Дополнительные (вспомогательные) окна я создаю в отдельных потоках, со своими диспетчерами и это работает хорошо. Вот я и подумал, что было бы здорово, чтобы то что в контролах у меня на главном окне, как в отдельных окнах обрабатывалось. |
26.11.2015, 17:56 | #4 |
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
|
А через Binding не проще? Вывод через Invoke в контролы wpf изначально не очень хорошая затея
Если поделитесь информацией что за контролы и какого рода данные вы в них выводите, то могу попробовать более конкретное предложение высказать )
Благодарить в репутацию. Проклинать — туда же
Последний раз редактировалось Luuzuk; 26.11.2015 в 18:02. |
26.11.2015, 18:13 | #5 | |
Пользователь
Регистрация: 25.06.2013
Сообщений: 14
|
Цитата:
|
|
26.11.2015, 18:24 | #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 Как вам такая затея?
Благодарить в репутацию. Проклинать — туда же
|
26.11.2015, 18:50 | #7 | |
Пользователь
Регистрация: 25.06.2013
Сообщений: 14
|
Цитата:
|
|
26.11.2015, 19:09 | #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 |