| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Помогите с событиями в C# |
| Автор: radiks 4.4.2008, 15:03 |
| Приведите, пожалуйста, простой пример работы с событиями. Например, как в реальном времени в textbox'е отобразить изменение в цикле переменной |
| Автор: _hunter 4.4.2008, 15:32 |
| А ты книгу какую-нить читать не пробовал?.. + не понятно зачем в описанной задаче события -- оно и без них прекрасно делается... ++ ты не поверишь, но в MSDN'е этих примеров -- хоть засыпся: http://msdn2.microsoft.com/en-us/library/aa645739(VS.71).aspx |
| Автор: radiks 4.4.2008, 16:20 |
| спасибо за ответ. Читать-то я читал, да только о делегатах и событиях там в консоли примеры... Вообще-то я начинающий в C# так, что не взыщите |
| Автор: radiks 7.4.2008, 08:44 |
| Вообще-то задача такая: прочитать текст из файла и в реальном режиме отображать каждую строку на форме (именно построчно, а не весь текст сразу). Я так понимаю без делегатов и событий тут не обойтись. Вроде все сделал работает, но в контроле отображается только одна строка. Срабатывает только тогда, когда я это событие отрабатываю через таймер... Спасибо за пример. Буду разбираться |
| Автор: source777 7.4.2008, 21:41 | ||||
|
| Автор: radiks 8.4.2008, 10:04 |
| А без таймера это можно реализовать?! Через события. При чтении новой строки вызвать событие, и через делегат отобразить строку. Или я чего-то не понимаю? |
| Автор: tol05 8.4.2008, 10:44 |
| можно. И это будет самым правильным (ИМХО) способом. |
| Автор: ivashkanet 8.4.2008, 11:00 | ||||||
| Не понимаю зачем нужны здесь события События нужны только в том случае когда объект выбрасывающий событие !ничего! не знает про тех кто его будут обрабатывать. Тут же все друг друга знают и все друг друга видят. Зачем здесь событие?
Налицо две операции: одна читает данные с файла, другая обновляет форму. И проблема заключается в том, что GUI (форма) просто не отрисовывается пока весь файл не прочтется, так как операции идут одна за другой, а не параллельно. Как добиться параллельного использования: 1) Либо использовать http://rsdn.ru/article/dotnet/WinForms20.xml#E3ZAG (именно он наиболее приспособлен для реализации многопоточности в GUI) 2) Либо использовать псевдомногопоточность реализуемую Application.DoEvents() 3) System.Threading.Thread даже не стоит и рассматривать. Не нужно решать высокоуровневые (GUI) вопросы низкоуровнемыми инструментами. Второй наиболее быстрый по скорости реализации, первый все же общепринятый подход. Код для второго случая:
Добавлено через 1 минуту и 36 секунд Скопировал бездумно код. ИМХО, нужно не заменять текст, а накапливать его в текстбоксе:
|
| Автор: tol05 8.4.2008, 11:10 | ||||
ммм. не вчитался в тему... Согласен.
будет "грузить" форму
не такой уж Thread и низкоуровневый |
| Автор: ivashkanet 8.4.2008, 11:31 |
Я ее тоже не сразу понял Не согласен. DoEvents() это всего лишь передача процессорного времени оброботчику сообщений приложения. И если делать это почаще (а ReadLine и сеттер Text работают очень быстро), то никто ничего не заметит. Но еще раз говорю: DoEvents() -- корявка, которая решает только небольшой круг задач многопоточночти для форм, но зато их решает просто замечательно (как с точки зрения скорости получения результата, так и с точки зрения понятности). И для этой задачи он идеален. Но повторю: только для этой (выполнить асинхронно !маленький! кусок функциональности). Ну да, есть еще ниже его. Но все же для GUI специально сделали Воркер (о котором у меня самые положительные впечатления). Не нжуно заморачивать на делегатах, инвоках, синхронизации и тыды... |
| Автор: radiks 8.4.2008, 11:33 |
| Спасибо за разьяснения. А можно все-таки примерчик с делегатами. |
| Автор: ivashkanet 8.4.2008, 11:37 |
| radiks, они не смогут решить проблему. Они не дают ассинхронности. Они только добавляют возможность абстрагироваться от тех кто будет обрабатывать твое сообщение. |
| Автор: radiks 8.4.2008, 12:01 |
| Добавил Application.DoEvents()... и ничего не изменилось |
| Автор: ivashkanet 8.4.2008, 13:52 | ||
| Смутил код: А почему if, а почему =?
Может я не понял задачу? Тебе что нужно? 1) Добавлять каждую новую строку к уже прочитанному тексту? //тогда просто замени if на while 2) Показывать только последнюю прочитанную строку (именно поэтому if и =)? // тогда зачем тебе это? ты все равно ничего не успеешь прочитать не замедляя процесс, а в этом случае без таймера не обойтись. P.S. Если все же вариант 2: source777, где ты учился на телепата? |
| Автор: mr.DUDA 11.4.2008, 10:04 | ||
|