0 / 0 / 1
Регистрация: 08.06.2016
Сообщений: 117
|
|
1 | |
Многопоточность форм21.06.2016, 23:36. Показов 1882. Ответов 18
Метки нет (Все метки)
Привет народ!
Пытаюсь написать программу в которой параллельно происходят некоторые вычисление, а результат можно было бы смотреть в разных окнах. Для этого создал главное окно, в котором можно смотреть в textbox состояние вычисление и дополнительное окно NextForm1 где отражается чарт (NextForm1.chart1) вычислений, это окно открывается путём клика по кнопки в главном окне и второе окно с кнопкой для второй программы вычисления. Задачу пытался решить двумя путями: 1. Написать класс который бы запускался из-под main или главной формы и в потоке делал вычисления и из этого классс менял бы значение textbox и графика. 2. Вычисления запускались бы в дополнительном окне где график и от туда бы меняли textbox в основном окне. Но первый вариант не сработал, потому что я так и не понял, как поменять значение из под отдельного класса содержание элемента texbox1 и чарт в дополнительной форме и при условии что NextForm1.Show(); не сотрёт всё. А второй вариант у меня не вышел потому что при каждом вызове NextForm1.Show(); метод в форме запускался снова и останавливался при выходе. Вопрос один, как лучше организовать архетиктуру для моей задачи, а второй где можно почитать примеры по много поточности, формам и взаимосвязи между ними (управление переменными и элементами друг друга)? Спасибо большое, заранее благодарен за ваш ответ!
0
|
21.06.2016, 23:36 | |
Ответы с готовыми решениями:
18
Многопоточность форм BackgroundWorker. Многопоточность. Как запустить несколько форм? Передать из форм 1, в форм 3. Многопоточность в C# |
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
|
|
21.06.2016, 23:40 | 2 |
MDI уже было?
0
|
0 / 0 / 1
Регистрация: 08.06.2016
Сообщений: 117
|
|
21.06.2016, 23:57 [ТС] | 3 |
Нет, но для меня желательней если бы окна открывались отдельно, но если легче сделать внутренние окна то рассмотрю, вопрос как. Я просто серверным кодингом в основном занимаюсь, поэтому здесь по некоторым вещам немного не в курсе.
0
|
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
|
|
22.06.2016, 00:02 | 4 |
0
|
0 / 0 / 1
Регистрация: 08.06.2016
Сообщений: 117
|
|
22.06.2016, 00:14 [ТС] | 5 |
А на описание на русском есть, что бы я смог понять как к моей задачи вообще можно перекрутить этот подход?
хотя отдельные окна меня больше устроили, с ними мою задачу не как нельзя связать? так что бы программы работали параллельно и могли общаться с окнами, а доп окна как бы были запущенны в фоновом режиме и строили график, а по клику кнопки открывались и отражали эти графики.
0
|
22.06.2016, 04:57 | 6 |
RomanSSS, Литература по C# для начинающих и не только, Шилдт, главы 23-24.
0
|
22.06.2016, 11:09 | 7 |
Сообщение было отмечено Даценд как решение
Решение
1) Создайте класс, который будет производить вычисления. Создайте у него событие, которые будет вызываться, когда получены какие-то промежуточные(?) результаты.
2) Запустите вычисления в отдельном потоке. 3) Создайте формы, которые могут брать промежуточные данные у класса (обратите внимание - не класс должен вызывать формы, а формы должны сами брать данные у класса!). 4) Обновляйте содержимое форм в главном потоке - по таймеру либо по событию класса. Класс не должен ничего знать о формах. Окно это визуальный компонент, предназначенный для взаимодействия с пользователем. Запускать вычисления в окне, это все равно что стирать в утюге. FAQ
0
|
0 / 0 / 1
Регистрация: 08.06.2016
Сообщений: 117
|
|
23.06.2016, 01:57 [ТС] | 8 |
Я думал в C# с формами как то проще и можно из-под класса запущенного в потоке, обращаться к объекту любой формы
А примеры есть, повторюсь с формами я работаю в первые, поэтому если есть примеры просьба сбросить ссылку!
0
|
23.06.2016, 10:43 | 10 |
Во-первых это ограничение не форм и не C#. Это ограничение WinAPI которое является однопоточным.
Во-вторых, вы поймите, что проблема не в том что бы обратиться к форме из класса. Это как раз не проблема. Проблема в том, что вы пытаетесь смешивать функционал вашей программы и интерфейс пользователя. Чего быть не должно. Разделение данных и интерфейса - это первая заповедь любой архитектуры. Разделите эти вещи и проблемы с обращениями к форме исчезнут сами собой.
1
|
23.06.2016, 12:57 | 11 |
Есть видео https://www.youtube.com/watch?v=N6RNy3rPZpg
На данном форуме отличная статья Архитектура ПО в WinForms (FAQ & HowTo)
0
|
0 / 0 / 1
Регистрация: 08.06.2016
Сообщений: 117
|
|
24.06.2016, 00:09 [ТС] | 12 |
В видео конечно чувак, совсем всё запутанно сделал, вот самый простой пример: http://kbss.ru/blog/lang_c_sharp/41.html
А товарищ выше предложил MDI использовать, а в этом методе какие преимущества, перед формами?
0
|
0 / 0 / 1
Регистрация: 08.06.2016
Сообщений: 117
|
|
25.06.2016, 00:36 [ТС] | 13 |
Так в чём всё таки различи MDI и WF для моей задачи, я просто посмотрел примеры в youtube в MDI точно так же, нужно объявлять окна и так же они общаются как и в WF.
0
|
25.06.2016, 01:10 | 14 |
Да нет никакой разницы. MDI это просто разновидность интерфейса (кстати устаревшая и давно вышедшая из моды) при которой дочерние окна открываются внутри главного окна, а не снаружи. Вот и вся разница.
0
|
0 / 0 / 1
Регистрация: 08.06.2016
Сообщений: 117
|
|
25.06.2016, 03:41 [ТС] | 15 |
Кстати вот сейчас пробую с чартом работать, он только с формой хочет дружить и как отдельным классом это собрать?
0
|
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
|
|
25.06.2016, 03:50 | 16 |
0
|
0 / 0 / 1
Регистрация: 08.06.2016
Сообщений: 117
|
|
25.06.2016, 03:52 [ТС] | 17 |
Storm23, DataPlanner просто посоветовал.
Здесь получается нужно сделать два расчёта в двух разных потоках. 1я. Строит Чартинг - что бы в отдельном окне отражает. 2я. Делает расчёты, обмениваясь данными с чартом. 3я. Отражает расчёт на главной, просто итоговые цифры 1. и 2. работают непрерывна в разных потоках и должны обмениваться данными 3. просто отражает полученные данные от 2и. Вот такой гемморой только в Виндовс можно встретить. В люникс взял сделал две функции в поток вставил и всё.
0
|
25.06.2016, 10:09 | 18 |
Ну откройте классические десктоп приложения и посмотрите
Сейчас в основном используют либо SDI (например MS Word, Notepad, Explorer), либо TDI (Notepad++), либо чаще всего TDI+SDI (Chrome, Photoshop, VisualStudio). В SDI на каждый документ выделяется отдельное окно. При чем каждое окно имеет полнофункциональное меню. Типичный пример MS Word: В TDI+SDI документы расположены во вкладках главной формы, а при "вытягивании" вкладки из главного окна - открывается новое окно. Chrome: Photoshop: Разница бывает в том, отображается ли в новом окне полное меню или нет. В Chrome и MS Word - отображается, в Photoshop и VS - нет. Примеров классического MDI в современном ПО я даже и не могу вспомнить. Только MS Excel, да и то там не совсем классический, потому что Excel допускает открытие документа в отдельном окне, листы документа организованы по TDI и кроме того, внутренние окна имеют свои кнопочки в таскбаре. По большому счету, если вы не знаете что там MDI, то его можно и не заметить.
3
|
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
|
|
25.06.2016, 12:38 | 19 |
0
|
25.06.2016, 12:38 | |
25.06.2016, 12:38 | |
Помогаю со студенческими работами здесь
19
Многопоточность Многопоточность Многопоточность многопоточность Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |