8 / 8 / 1
Регистрация: 17.01.2010
Сообщений: 172
|
||||||
1 | ||||||
Как создать три потока с одним методом26.02.2012, 18:20. Показов 4366. Ответов 19
Метки нет (Все метки)
Не могу создать 3 потока и запустить их. Суть проги такая. В ТекстБокс1 и ТекстБокс2 вводятся данные, если эти данные числа, то они суммируются, если не числа, то они соеденяются. Это я оформил в виде метода MyMetod. Мне надо чтобы по нажатию кнопки создалось 3 потока и в них выполнялся мой метод.
0
|
26.02.2012, 18:20 | |
Ответы с готовыми решениями:
19
Как использовать объект, созданный одним методом, другим методом? Как сделать INSERT в три таблицы одним махом (соединены 1 к 1) Как остановить три потока по очереди? Работа с сокетами, как сделать весь цикл While одним методом |
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
||||||
26.02.2012, 18:40 | 2 | |||||
2
|
8 / 8 / 1
Регистрация: 17.01.2010
Сообщений: 172
|
|
26.02.2012, 19:23 [ТС] | 3 |
Спасибо за код. Попробую.
Добавлено через 2 минуты Не сработало. На этой строке выходит ошибка " Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'textBox4' не из того потока, в котором он был создан."
0
|
Заблокирован
|
|
26.02.2012, 19:39 | 4 |
По поиску на форуме в этом разделе или на раздел выше по ключевым словам "Invoke" или "delegate" посмотрите.
Для работы потоков с контролами формы есть ограничения, которые нужно обходить.
0
|
26.02.2012, 19:42 | 5 |
Смотри тут: Создать label на форме из другого потока и работать с ним (метод UpdateInformation)
0
|
8 / 8 / 1
Регистрация: 17.01.2010
Сообщений: 172
|
|
27.02.2012, 08:48 [ТС] | 6 |
Я не силен в делегатах. Может кто поможет.
0
|
Exerion
|
27.02.2012, 09:45
#7
|
Не по теме: Было бы неплохо почитать на форуме разжёванную статью про делегаты. Я уже полгода сижу на шарпе, но пока с делегатами не дружу. Чисто человеческий смысл их не понимаю: что это, зачем это, как использовать это и т.д. Может, опыта мало для понимания... Статьи на msdn (и не только на msdn) простого объяснения не дают, но благо у меня пока не возникало ситуации, в которой без делегатов не обойтись. Но ведь они очень распространены и используются довольно часто.
0
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
27.02.2012, 09:51 | 8 |
Exerion, делегат - это ссылка на метод. Больше там и объяснять-то нечего.
Используется, соответственно, там, где надо передать ссылку на метод в другой метод/класс, который потом ее будет использовать.
1
|
[Bicycle Reinventor]
|
|
27.02.2012, 10:30 | 9 |
kolorotur, тогда в чём основная суть? Вопросов только больше становится.
Например, если сделать метод модификатором public, к нему и без делегатов доступ будет. 1. В каких ситуациях вообще возникает необходимость "передавать ссылку на" ? 2. Можно ли с помощью делегата обратиться к методу определённого не static класса, без объявления его экземпляра? 3. Можно ли с помощью делегата взаимодействовать с одним и тем же com-портом из нескольких потоков одновременно? и в целом 4. В чём основное преимущество делегатов; когда их принято использовать?
0
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|||||||||||
27.02.2012, 10:50 | 10 | ||||||||||
Основная суть в том, чтобы сторонней системе предложить свою реализацию определенной части задачи. А-ля плагин.
Вы LINQ'ом, к примеру, пользуетесь? Вот там повсюду делегаты требуются, их еще зачастую через лямбда-выражение пишут. Возьмем, например, метод-расширение Select. Вся его суть заключается в том, чтобы взять из источника каждый элемент и преобразовать его в другой тип. Собственно, переданный в метод Select делегат и отвечает за преобразование. Реализация этого метода выглядит так:
То есть для каждого элемента в источнике запускается некий метод, который принимает на входе тип элемента, содержащегося в источнике, и возвращает экземпляр другого типа. Что именно происходит при вызове делегата selector определяет пользователь, давая ссылку на нужный ему метод.
Нет, так как не-статический метод является членом экземпляра класса. Соответственно, без наличия экземпляра этого метода не существует. Не совсем понял вопрос. Если в вашей системе имеется возможность вызывать некий метод из нескольких потоков одновременно для взаимодействия с ком-портом без обрушения программы, то можно. Когда надо вызвать метод, реализация которого может меняться в зависимости от текущих требований.
2
|
8 / 8 / 1
Регистрация: 17.01.2010
Сообщений: 172
|
||||||
27.02.2012, 19:15 [ТС] | 12 | |||||
добрый вечер это снова я. Переписал код, и он даже компилируется без ошибок, и что странно работает. Хотелось бы узнать правильно я воспользовался делегатами или я все таки китаец .
0
|
27.02.2012, 19:31 | 13 | |||||
Я бы как-то так сделал:
0
|
8 / 8 / 1
Регистрация: 17.01.2010
Сообщений: 172
|
|||||||||||||||||||||
27.02.2012, 22:15 [ТС] | 14 | ||||||||||||||||||||
Последний вопросик. надеюсь последний. Чем отличается
t
Переписал программу. добавив приоритеты потокам и счетчик времени выполнения потока. Снова ошибка в
Наиболее подходящий перегруженный метод для "System.Threading.Thread.Thread(System.Threading.ParameterizedThreadStart)" имеет несколько недопустимых аргументов Вот код программы
Разработать программу, осуществляющую ввод двух строк, введенных пользователем. Далее, если обе строки хранят целые числа со знаком, то на экран выводится сумма чисел, в противном случае – конкатенация двух введенных строк. Проверку на соответствие строки целому числу, вычисление суммы чисел и конкатенации строк оформить как три разных функции потока (с приоритетами, соответственно, THREAD_PRIORITY_ABOVE_NORMAL, HREAD_PRIORITY_LOWEST и THREAD_PRIORITY_IDLE). Ввод строк осуществляется до запуска всех потоков, а вывод результатов – после их завершения. Также выводятся значения времени работы каждого потока.
0
|
27.02.2012, 22:40 | 15 | |||||
Ты всерьёз считаешь что это хороший способ?
Не по теме: Заметил практически всегда, после того как покажешь вариант получше (если он конечно реально лучше), его всё равно не используют. Проблема в том, что у тебя в методе 2 параметра. Короче посмотри как объявлен делегат ParameterizedThreadStart, у него 1 параметр типа object, а ты ему "суёшь" метод с 2-мя параметрами.
0
|
8 / 8 / 1
Регистрация: 17.01.2010
Сообщений: 172
|
|
27.02.2012, 22:52 [ТС] | 16 |
Здесь смысл задачи не в этом, а именно создать 3 потока с разными приорететами и посчитать затраченое время на выполнение каждого потока.
Разве в методе не может быть 2 параметра? Добавлено через 3 минуты Может я не понял пример, но кажется как то глупо создавать второй метод, когда можно использовать один.
0
|
27.02.2012, 22:55 | 17 |
Да какая разница, как мне кажется всегда надо стараться сделать лучше. Хотя, если просто лишьбы задачу решить.
Вообще дочитал что я дальше написал? Добавлено через 1 минуту Да я про свой вариант твоего метода: Как создать три потока с одним методом
0
|
8 / 8 / 1
Регистрация: 17.01.2010
Сообщений: 172
|
|
28.02.2012, 09:33 [ТС] | 18 |
Так как мне сделать мой метод с двумя параметрами? Судя по этой статье http://msdn.microsoft.com/ru-r... 53s52.aspx мне надо создать второй метод?
0
|
6 / 6 / 0
Регистрация: 28.02.2012
Сообщений: 14
|
|||||||||||
28.02.2012, 10:41 | 19 | ||||||||||
Попробуй сделать так:
1
|
8 / 8 / 1
Регистрация: 17.01.2010
Сообщений: 172
|
|
28.02.2012, 20:08 [ТС] | 20 |
Домой приду попробую.
Добавлено через 18 секунд Домой приду домой попробую. Добавлено через 9 часов 7 минут Спасибо всем за помощь. Программа работает как надо. Замечания по оптимизации кода форумчанина Casper-SC были учтены.
0
|
28.02.2012, 20:08 | |
28.02.2012, 20:08 | |
Помогаю со студенческими работами здесь
20
Как передать значение возвращёное одним методом в другой метод Как можно обрабатывать разные типы одним и тем же методом кроме перегрузки Сформировать как минимум три потока, которые будут вычислять значение бесконечной суммы с заданной точностью Как после обработки потока запустить его с новым методом? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |