|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
10.04.2017, 19:24 | #1 |
Пользователь
Регистрация: 28.03.2011
Сообщений: 38
|
BackgroundWorker и две формы - C#
Имеется родительская форма, в который выполняется расчет (некоторый метод) в процессе которого данные передаются в дочернюю форму для динамической отрисовки. Это все работает. Захотел я чтобы главная форма не зависала в момент расчета. Поставил компонент BackgroundWorker, который и вызывает тот самый метод для вычислений. Теперь родительская форма не зависает, но зависает дочерняя, ее невозможно не свернуть ни закрыть даже после окончания расчета, хотя отрисовка работает по прежнему правильно, т.е. когда расчет идет отрисовка происходит, расчет заканчивается отрисовка тоже останавливается, только вот эта форма дочерняя так и остается заблокированной, а потом почему то сама закрывается. Как быть, может есть идеи?
|
11.04.2017, 09:26 | #2 |
Пользователь
Регистрация: 11.04.2017
Сообщений: 64
|
А зачем таким извратом заниматься?
Делай проще, есть 2 способа 1. Если под Фреймворк до 4.5 = через интерфейс IASyncResult + callback 2. Если на 4.5 и выше - то расчет проделывай через аsync/аwait, и вызывай вторую формочку через ShowDialog() и DialogResult |
12.04.2017, 16:15 | #3 |
Пользователь
Регистрация: 28.03.2011
Сообщений: 38
|
Ну вот сделал через аsync/аwait. В итоге все работает также как с BackgroundWorker. А если вызывать не Show второй формы а ShowDialog то форма конечно не висит, но на ней ничего и не рисуется
|
12.04.2017, 16:30 | #4 |
Пользователь
Регистрация: 11.04.2017
Сообщений: 64
|
Давайте конткретнее задачу. UI это 1 поток, все расчеты делайте в асинхронном режиме. т.е. все рисовалки вызывайте в том же потоке, что и интерфейс, а математику во вторичном. Иначе мы друг друга не поймем. Можно, конечно же, высверлить недосягаемость UI потока, но это костыль, и не рекомендуется.
|
12.04.2017, 16:42 | #5 |
Пользователь
Регистрация: 28.03.2011
Сообщений: 38
|
Вот как код выглядит сейчас (лишнее я убрал, оставил только суть, чтобы Вы поняли)
PHP код:
|
12.04.2017, 16:50 | #6 |
Пользователь
Регистрация: 11.04.2017
Сообщений: 64
|
Ну вот и архитектурная ошибка огромнейшая. НЕЛЬЗЯ!!! в не-UI потоке работать с UI-потоком напрямую. Это грубейшее нарушение. Вы запускаете таску, она переходит в пул потоков, где и приступает к работе, когда до нее доходит очередь. Если так критично отрисовывать - то в таске просто меняйте переменные (например статические - они едины для потоков). А в главном потоке зарегистрируйте событие на изменение переменных и поставьте какой-то обработчик события на изменение этих переменных - и в обработчике рисуйте на здоровье.
|
12.04.2017, 16:54 | #7 |
Пользователь
Регистрация: 28.03.2011
Сообщений: 38
|
Спасибо, в принципе обдумывал такой вариант, но думал что можно найти выход из моей реализации...
|
12.04.2017, 16:56 | #8 |
Пользователь
Регистрация: 28.03.2011
Сообщений: 38
|
Получается в принципе могу оставить и BackgroundWorker, т.к. там уже прогресс бар есть и отмена. Но просто от-туда извлечь отрисовку и поставить ее на событие? так?
|
12.04.2017, 16:59 | #9 |
Пользователь
Регистрация: 11.04.2017
Сообщений: 64
|
Можете и так, просто BackgroundWorker - это уже устаревшее на сегодняшний день решение. Как точно оно работает внутри - я не смотрел, если честно. Раньше вообще извращались через Application.DoEvents().
|
12.04.2017, 18:41 | #10 |
Пользователь
Регистрация: 28.03.2011
Сообщений: 38
|
А не подскажете еще как в событии отслеживать изменение переменных?
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Две формы в Delphi | Kotlyar562 | Помощь студентам | 10 | 05.03.2011 23:36 |
Две формы. Перекрывание. | Alex Cones | Общие вопросы Delphi | 4 | 30.05.2010 14:33 |
Вопрос про две формы... | doniyor | Общие вопросы Delphi | 5 | 13.08.2009 17:18 |
две формы | StakanpORTvejna | Общие вопросы Delphi | 4 | 04.05.2009 19:32 |
две формы в одном приложении.. | AXEnic | Общие вопросы Delphi | 6 | 22.04.2009 16:52 |