![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| savage |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 13.8.2003 Репутация: нет Всего: нет |
Всем привет. Только не отправляйте сразу в поиск - там уже был.
Встала проблема при организации отдельного потока в приложении Windows Forms. Я просмотрел все что на форуме сть, все пользуются Invoke и BeginInvoke, сам с потоками только в консольных приложениях работал через Thread, и поэтому особых проблем раньше не было. Вопрос, почему такой пример не работает, так ведь вроде все делают. Меня интересует решение черз invoke, для примера взял вот такой простенький пример, на форме есть текст бокс в который из другого потока каждую секунду грузится строка с текущем временм.
|
|||
|
||||
| archeg |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 612 Регистрация: 6.1.2007 Где: Киев Репутация: 11 Всего: 27 |
У тя там какая-то странная рекурсивность... П.С. Что за гугл к топику прилип???? Он меня бесит Это сообщение отредактировал(а) archeg - 20.10.2007, 14:42 -------------------- ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru) Дядька всегда можно спросить в аське, если не задалбывать - не откажет И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои ;) |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
Да я вообще не пойму замысла savage..
Что делает этот пример? Ну нажали кнопку, и что? Все происходит в одном потоке, второго нет. Так зачем Invoke? Это раз. Во-вторых, допустим нажали кнопку и делегат сработал. Зашли в setToText() BeginInvoke породил новый поток и текстбокс нуждается в Invoke. Вызвали. И дальше - все, тушите свет.
конечно бесконечная рекурсия с тем же делегатом, который вызывает BeginInvoke на самого себя... Короче - непонятно что хотел автор. никто так не делает. Ты сделал делегат для обновления текстбокса? Ну так и обнови его. Зачем снова BeginInvoke вызывать? Это новый участник форума! Ты ответь ему, чтоб не постился больше. Или модераторов попроси забанить за оффтоп его!! мда. Похоже скоро винград станет гаджетом гугл. Все к этому идет -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| savage |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 13.8.2003 Репутация: нет Всего: нет |
archeg, спасибо!
tol05, я понимаю что это выглядит как сборная солянка Пример такой выбрал потому что для меня то по сути не важно что там делается обновляется текстовое значение текст бокса или делаются какие то вычисления. Решил просто попробовать сделать что то элементарное, по типу таймера, для практики работы взаимодействия потоков и контролов формы. Я под консоль делал на Thread`ах, там небыло таких проблем, проще как то было. А сейчас тонкостей всяких с формами еще не знаю. Вот и копаюсь.
А есть альтернативный способ? Только не таймер. Ну и раз уж так. Не могли б вы объяснить, как же тогда грамотно организовать работу дополнительного потока, чтоб он мог изменять контролы на форме? Хотяб даже на моем простом примере. |
||||
|
|||||
| archeg |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 612 Регистрация: 6.1.2007 Где: Киев Репутация: 11 Всего: 27 |
Не въехал, как нет другого потока? Это ж АРМ Я не понимаю, почему люди так не любят таймеры? ) Да и вообще я против вызовов самого себя(я про метод setToText
Я так понимаю эт просто пример) вряд ли кто-то так в коде будет писать....
эххх ( Это сообщение отредактировал(а) archeg - 20.10.2007, 18:20 -------------------- ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru) Дядька всегда можно спросить в аське, если не задалбывать - не откажет И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои ;) |
||||||||
|
|||||||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
savage, ок. Когда-то несколько топиков было на эту тему, но пока их найдешь... Проще еще раз написать... Итак:
Немного теории: Вин-формс контрол позволяет с собой работать только в том потоке, где он был создан. Т.е. в основном потоке программы (помеченном STAThread). Если нужно из другого потока обратиться к контролу - используется технология Invoke (о том, какие потоки часто требуют этого - ниже напишу). Если обращение к контролу идет из того же потока - Invoke не требуется. Как работает Invoke? Просто. Каждый поток имеет очередь сообщений. Контрол, к примеру, создан в потоке А. Вызвовом Invoke() из потока B мы посылаем сообщение потоку А (типа "а ну-ка вызови нам метод TextBox.Refresh()" ). Посланное сообщение попадает в очерь потока А, а мы продолжаем работу в потоке B дальше (если вызывали BeginInvoke) или сидим в своем потоке B и ждем результатов (если вызывали Invoke). Поток А отработал свою текущую задачу (через полчаса Контрол имеет свойство Control.InvokeRequired - оно говорит, нужно ли использовать Invoke или нет (т.е. находишься ли ты в основном потоке или ты сейчас находишься во внешнем по отношению к контролу потоке). Это свойство - для удобства. Я им никогда не пользуюсь потому что всегда сам знаю "Required" ли контрол Invoke или нет Какие могут быть "другие потоки" - это рабочие потоки Thread, потоки пула потоков, потоки АРМ (Asynchronous Programming Model - те же потоки пула, на самом деле), потоки ввода/вывода. Ну и все, по-моему (BackGroungWorker я в расчет не беру - не люблю его... К нему, ИМХО, привыкнешь - вообще с потоками работать разучишься В твоем примере я вообще не вижу необходимости использовать Invoke. Обычно это нужно, если в логику формы добавляются те самые Thread (которые ты любишь Вот, например, топик, где без Invoke не обойтись Ну а твой пример я немного переделал (чтобы можно было посмотреть, когда контрол нуждается в Invoke, а когда - нет):
Я имел в виду, что в программе не используются никакие другие потоки, кроме основного. Ну а то, что АРМ автор сам создает через BeginInvoke (хотя мог бы Invoke - и не было бы тогда АРМ Я это имел в виду. Это сообщение отредактировал(а) tol05 - 20.10.2007, 18:49 -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| savage |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 13.8.2003 Репутация: нет Всего: нет |
tol05, благодарю за развернутый ответ! многое прояснилось! Спасибо большое
|
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |