Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > .NET для новичков > Проблема с потоками |
Автор: ДобренькийПапаша 28.4.2010, 12:09 | ||||
Решил всё-таки отдельную тему сделать, попробую сформулировать правильно. Из функции по делегату в новом потоке вызывается функция парсинга текстового файла (выдираются значения для графика).
Сам метод парсинга:
Из-за того, что прикручивание находится в блоке InvokeRequired, то прикручивание происходит очень медленно, т.е. я некоторое время наблюдаю как точка за точкой появляются на графике... Соответственно надо это вынести в основной поток, откуда был запуск, но если в функции StartParsing раскомментить строки, то почему-то, дальше chart.Join() выполнение не идёт (ждал долго, быть такого не может). Короче, какой может быть выход из сложившейся ситуации? |
Автор: Miller_time 28.4.2010, 12:20 | ||
А у тебя
находиться в разных потоках? Может быть просто дожидаеться пока, один поток закончит, работы с обьектом и передаст управление другому обьекту. |
Автор: ДобренькийПапаша 28.4.2010, 12:39 | ||||
В разных потоках находится. По поводу дождаться читайте выше. |
Автор: Heinzz 28.4.2010, 13:27 |
а ежели Invoke не Required ![]() |
Автор: ДобренькийПапаша 28.4.2010, 13:59 | ||
Это вы к чему? p.s. Пожалуйста, не пишите в тему, если не знаете как решить проблему. |
Автор: mrbrooks 28.4.2010, 14:46 | ||
ДобренькийПапаша, не совсем понятно - заполнение графика идет во время парсинга или уже с формированным набором данных? Если первое - то имхо - это не очень удачное решение. Если второе - передай массив данных как параметр в функцию, адрес которой передаешь потоку.
зы. и в догонку что используете - MS Chart? Это реально важно - ибо здесь уже можно задействовать гораздо более эффективные способы вывода данных. |
Автор: ДобренькийПапаша 28.4.2010, 19:17 |
Использую MSChart. Сейчас график наполняется точками в функции парсинга, это как вы сказали неудачно. Так и есть! Я же написал, что я в функции парсинга, запущенной в новом потоке мне приходится обращаться через InvokeReqiured к графику... что замедляет очень сильно наполнение графика точками. Я пытался сделать так, чтобы результаты парсинга присваивались коллекциям на уровне класса, чтобы прикрутить точки к графику уже в основном потоке, но какие я встретил проблемы я тоже описал выше... |
Автор: mrbrooks 28.4.2010, 23:01 | ||||
Ок. Я понимаю вашу озабоченность. Если вы используете M$ Chart - то используйте всю его мощь при работе с наборами данных. Продемонстрирую на примере: Есть класс - характеризующий некую сущность - в моем случае координаты по Х и У:
Тогда общее решение:
Данный код вывел 10000 точек менее чем за секунду (у меня есесно). У меня складывается впечатлении что мы с вами уже этот вопрос обсуждали. Речь шла о парсинге CSV файла. Если это та же история я настоятельно рекомендую использовать все стандартные возможности для работы с файлом как с БД. Это быстрее и надежнее, чем строить по точкам и писать парсеры. |
Автор: ДобренькийПапаша 29.4.2010, 07:55 | ||||
После завершения работы функции график остаётся белым. Посмотрел в отладчике, stockPoints имеет 80 точек как и должно быть, а вот после прохода функции currentChart.DataBind() currentChart.Series[0].Points.Count=0, т.е. привязка не произошла как я понимаю... |
Автор: ДобренькийПапаша 29.4.2010, 08:24 | ||
Так всё работает и очень быстро, спасибо mrbrooks за подсказу использовать binding. |