Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 14.11.2017
Сообщений: 6
.NET 4.x

Ошибка с типом данных в программе

22.11.2017, 20:26. Показов 1153. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В программе используется тип данных double, на форме строится график по вычисляемой переменной, и чем дальше он строится тем медленнее это происходит, а в определенный момент он просто останавливается. Я подозреваю тут дело в вычислении этой переменной и увеличении ее точности что в итоге переполняет память. Проект прикрепил. Нажмите старт в программе и начнет строится график (сбоку есть ползунок ускорения), он будет становится все медленнее и медленнее. Как мне это исправить? Округление Math.Round() не помогает.
Вложения
Тип файла: zip Predator.zip (214.6 Кб, 4 просмотров)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.11.2017, 20:26
Ответы с готовыми решениями:

Ошибка в программе связанной с базой данных
Программа должна осуществлять авторизацию. Оператор вводит свой id и пароль, а программа проверяет их с данными записанными в базе MS...

class <T> и Dictionary со свободным типом данных
Всем доброго, есть проблема, не знаю как ее решить... Есть класс public class File &lt;T&gt; { public...

Расчет суммы. Точность вычисления с типом данных double
Здравствуйте, объясните пожалуйста почему при расчете суммы в зависимости от порядка сложения получаются разные результаты? namespace...

6
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.11.2017, 11:31
Лучший ответ Сообщение было отмечено ruyep как решение

Решение

У вас тип линии установлен на Spline — он будет очень сильно тормозить и гадить в кучу при большом количестве точек, потому что между каждыми двумя точками нужно будет высчитывать кривую.
Измените тип линии на Line — если количество точек превышает ширину графика в пикселях, то высчитывать кривые нет смысла.
Еще лучше выбирайте наиболее подходящий тип линии динамически перед началом отрисовки — в зависимости от количества точек и размера графика в пикселях. Если точек немного, то можно использовать Spline для плавных линий, если количество точек начинает превышать ширину графика или опытным путем будет установлено, что после определенного количества точек начинаются тормоза, то меняйте тип на Line. При очень большом количестве точек используйте FastLine.
1
549 / 480 / 315
Регистрация: 24.09.2013
Сообщений: 3,345
Записей в блоге: 1
23.11.2017, 11:35
Посмотрел программу, ничего ценного не нашел. Лучше всего напишите четко условие и этого будет достаточно
0
0 / 0 / 0
Регистрация: 14.11.2017
Сообщений: 6
23.11.2017, 15:17  [ТС]
kolorotur, да спасибо, это повысило производительность, но всё же, тут ведь дело не в двух точках, чем длиннее становится график тем он медленнее отрисовывается, я думаю тут дело в типе данных с его громадной точностью. Может быть разбить вычисление и отрисовку на потоки или изменить тип данных на не такой громоздкий? Что вы думаете?

Добавлено через 11 минут
kolorotur, потестировал, что на типе данных line что на fastline график хорошо рисуется, но доходя до отметки 1000 по вертикали он просто останавливается, я уверен тут все дело в типе данных и вычислении переменной.
скрин
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.11.2017, 15:22
Цитата Сообщение от ruyep Посмотреть сообщение
тут ведь дело не в двух точках
Верно — дело в тысяче этих точек.

Цитата Сообщение от ruyep Посмотреть сообщение
чем длиннее становится график тем он медленнее отрисовывается
Когда вы добавили первую точку, график отрисовывает одну точку.
Когда вы добавили вторую точку, график отрисовывает первую и вторую точки и высчитывает кривую между ними.
Когда вы добавили третью точку, график отрисовывает первую точку, вторую точку, высчитывает и отрисовывает кривую между ними, потом рисует третью точку, высчитывает и отрисовывает кривую.
И так для всех тысячи точек: с добавлением новой отрисовываются и высчитываются с нуля все предыдущие.
Расчет кривой для типа Spline — медленная и довольно серьезно мусорящая операция, потому не надо ее использовать для большого количества точек.

Цитата Сообщение от ruyep Посмотреть сообщение
я думаю тут дело в типе данных с его громадной точностью.
Не имеет отношения.
Тем более не объясняет почему при тех же значениях но другом типе графика улучшается производительность.

Добавлено через 1 минуту
Цитата Сообщение от ruyep Посмотреть сообщение
доходя до отметки 1000 по вертикали он просто останавливается
Простите за нескромный вопрос, но это приложение вы писали?
Там в нижней левой части окошка поле "Количество цыклов" (цикл пишется через "и") — в нем значение 1000, вот и генерируется тысяча точек.
0
0 / 0 / 0
Регистрация: 14.11.2017
Сообщений: 6
23.11.2017, 15:46  [ТС]
Простите за нескромный вопрос, но это приложение вы писали?
Там в нижней левой части окошка поле "Количество цыклов" (цикл пишется через "и") — в нем значение 1000, вот и генерируется тысяча точек.
kolorotur, подловили, подловили, тут не поспоришь. Недоглядел) Окей разобрались, последний вопрос - по вашему мнению для данной программы тип данных выбран правильно?

Добавлено через 8 минут
Он строится довольно медленно как для отрисовки в 1 мс по таймеру, он должен быть молниеносен как по мне. Или может использовать другой, более точный инструмент для регулировки скорости отрисовки?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.11.2017, 16:07
Цитата Сообщение от ruyep Посмотреть сообщение
по вашему мнению для данной программы тип данных выбран правильно?
В семантику сильно не вникал, но судя по всему программа генерирует популяцию различных видов животных в зависимости от того, кто кого и сколько съел?
Немного странно видеть 4.342556475 медведя, но в техническом плане тип double выбран правильно — это именно тот тип, который ожидается в методе AddXY, вызываемом по таймеру. Был бы другой тип, то все равно пришлось бы его сначала конвертировать в double.

Цитата Сообщение от ruyep Посмотреть сообщение
Он строится довольно медленно как для отрисовки в 1 мс по таймеру
У обычного (не мультимедийного) таймера в виндовсе разрешение 16мс, значит чаще он тикать не будет даже если поставить ему интервал 1 мс.
Но даже если бы он мог выдавать такую точность, то посудите сами: по сути вы хотите выжать 1000 фпс при отрисовке графика. Не многовато?
При минимальном интервале в 16мс получается фпс в районе 60-и, что вполне допустимо. График на 1000 точек отрисуется секунд за 17.
Если вас не интересует "анимация" отрисовки, а просто хочется видеть конечный результат, то сначала рассчитайте значения всех точек, а потом разом "скормите" их графику.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.11.2017, 16:07
Помогаю со студенческими работами здесь

Работа с массивом, принимаемым по serial interface, как с типом данных byte
Здравствуйте, обращался к программистам, но мой вопрос их ставил в тупик. Принимаю от электронного устройства на ПК последовательность...

Ошибка с типом данных date
Здравствуйте, помогите пожалуйста с данной проблемой, выполняю обучающее задание создать некую таблицу, и заполнить его записями. ...

Ошибка с типом данных bool
Помогите разобрать ошибку, суть следующая есть массив use, который помечает куда записывались переменные, если массив use типа bool то...

Ошибка с типом данных Currency
Делаю программу в Visual Studio, пишу, например Dim A As Currency, при этом Currency подчеркнут красной волнистой линией. Если навожу, то...

Ошибка с типом данных после умножения
Помогите пожалуйста! У меня SQL Server2000 там есть таблица ,где поле cena описана как decimal с дробной частью =2 теперь в коде asp...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru