![]() |
|
Модераторы: diadiavova, gambit |
![]()
|
|
| ShamanK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 24.2.2010 Репутация: нет Всего: нет |
подскажите пожалуйста методы при которых скорость прорисовки ломанных линий была бы МАКСИМАЛЬНОЙ.
необходимо отрисовывать в режиме реального времени тиковый график цены акции. ( линия - изменения в цене происходят очень быстро, когда раз в секунду когда медленней, но чаще всего по несколько изменений в секунду) Это сообщение отредактировал(а) ShamanK - 26.2.2010, 23:07 |
|||
|
||||
| xXxSataNxXx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 25.12.2009 Репутация: 1 Всего: 1 |
Вопрос не совсем понятен, поподробней немного можно?
|
|||
|
||||
| ShamanK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 24.2.2010 Репутация: нет Всего: нет |
я пишу ( по крайней мере пытаюсь ))) ) привод для торговли на фондовом рынке.
есть поставщик котировок - удаленный комп есть интерфейс апи к серверу и есть моя программа, которая через апи слушает сервер. каждое событие это новая цена, все изменения цен я должен объединить в ломанную линию.. суть вопроса в том, что поскольку события могут приходить ну ОЧЕНЬ часто - по несколько в секунду, то возникает вопрос каким методом рисовать эту линию чтобы она рисовалась в реальном режиме времени и не тормозила. |
|||
|
||||
| xXxSataNxXx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 25.12.2009 Репутация: 1 Всего: 1 |
Скорость будет одниковая в любом случает... GDI+ не самое скоростное решение для рисовании, но DirectX использовать было бы смешно... =0)
Так что GDI+... Тут ещё всё зависит от того, как именно ты хочешь рисовать, можно рисовать одним цветом, но думаю на бирже это не целеобразно, так что остаётся 1 вариант, создать массив точек и через цикл проверять их и рисовать линии синим и красным например... Это сообщение отредактировал(а) xXxSataNxXx - 27.2.2010, 01:02 |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
А какой смысл вносить изменения чаще раза в секунду? Не важно как часто меняется информация, человек её может воспринимать с ограниченной скоростью. Хотя согласен гди+ вполне достаточно даже при более частом обновлении, будет тормозить - двойная буферизация поможет.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| ShamanK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 24.2.2010 Репутация: нет Всего: нет |
спасибо за ответы.
можно поподробней про двойную буферизацию? что это и с чем едят? я пишу скальперского полуробота, скальпинг это сделка длящаяся секунды.. потому мне и надо отрисовывать каждое изменение цены. |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| ShamanK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 24.2.2010 Репутация: нет Всего: нет |
прочел
такой вопрос на сайте мсдн предлагают в конструкторе поставить тру напротив двойной буферизации. в этом варианте все элементы формы будут проходить через двойную буферизацию? тоесть просто поставить галочку и больше ничего делать не надо? просто рисовать? качнул пример с инета:
вопрос достаточно ли на главной форме свойству двойной буферизации поставить значение ТРУ и с помощью вышеприведенного кода рисовать график в PictureBox расположенном на этой форме ? или это вообще не GDI+? |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| ShamanK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 24.2.2010 Репутация: нет Всего: нет |
diadiavova - вы слишком высокого мнения обо мне, тут бы с существующими разобраться, а вы предлагаете свои создавать.. я даже и не знаю как это делается.. но вопрос сразу возникает что будет быстрей работать стандартный контрол или собственный?
как вы наверно уже поняли - прога которую я делаю должна быть максимально быстрой.. PS хотя в моем случае быстрей будет работать стандартный контрол )) ибо если я создам свой то он будет тормозной до ужаса.. |
|||
|
||||
| xXxSataNxXx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 25.12.2009 Репутация: 1 Всего: 1 |
Сколькими цветами ты рисовать хочешь?
Если 1 то это легче пареной репы будет для тебя, а если 2 и более, то посложнее... |
|||
|
||||
| ShamanK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 24.2.2010 Репутация: нет Всего: нет |
одна линия = один цвет
линий несколько |
|||
|
||||
| xXxSataNxXx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 25.12.2009 Репутация: 1 Всего: 1 |
Создай массив точек и рисуй...
Это сообщение отредактировал(а) xXxSataNxXx - 27.2.2010, 13:39 |
|||
|
||||
| ShamanK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 24.2.2010 Репутация: нет Всего: нет |
нет нет .. на открытие это форма условия торговли.. чутка объясню
скальпинг очень высоко рискованный стиль торговли.. программа заточена на нажатие клавиш на клаве.. чтобы при открытой программе (главной форме) случайно не нажать быстрые клавиши которые приведут к открытию сделок я сделал следующее: кликаю по кнопке - открывается форма TAlert, навожу на нее мышку, она окрашивается в зеленый цвет, и только после этого быстрые клавиши на клаве приводят к торговым действиям, если мышка не на форме TAlert она окрашивается в красный цвет ( тоесть торговли нет) и я могу клацать по клаве сколь угодно долго, к торговым действиям это не приведет.. так что график на этой форме не рисуется, он рисуется на главной форме |
|||
|
||||
| xXxSataNxXx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 25.12.2009 Репутация: 1 Всего: 1 |
Тогда смотри сообщение выше, я его отредактировал и снял те вопросы...=0)
|
|||
|
||||
| ShamanK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 24.2.2010 Репутация: нет Всего: нет |
написал:
выдает ошибку на строке gp.addlines(p): Переменная gp используется до присвоения ей значения. Во время исполнения может произойти исключение при ссылке на значение NULL. |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
Пикчербокс предназначен для отображения картинок, я так понимаю тебе это не нужно, стало быть нет смысла его использовать. Создать контрол просто: добавляешь в проект новый элемент и в диалоговом окне выбираешь UserControl или Control. В нём надо переопределить метод OnPaint и в нём выполнить прорисовку. Фон(например оси графика) можно прорисовывать там же или в методе OnPaintBackground. А вообще по теме начни отсюда http://msdn.microsoft.com/ru-ru/library/6hws6h2t.aspx -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| xXxSataNxXx |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 25.12.2009 Репутация: 1 Всего: 1 |
А ещё лучше, чтоб не писать Drawing2D.GraphicsPath и тому подобные графические функции, перед классом формы добавь
И этот код не обязательно ставить в событие Paint... Это сообщение отредактировал(а) xXxSataNxXx - 27.2.2010, 17:37 |
||||
|
|||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
Прорисовка должна выполняться или в обработчике этого события или в переопределённом методе OnPaint(в производном классе), иначе изображение не будет устойчивым и исчезнец при очередной перерисовке контрола. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| xXxSataNxXx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 25.12.2009 Репутация: 1 Всего: 1 |
Согласен, что исчезнет, но если там постоянное обновление, то все точки будут прорисовываться постоянно...
А на сколько я помню, обновление графикка будет идти со скоростью не больше 1 секунды... =0) Можно вынести точки, чтоб они хранились не в обработчике типо "Public p() as point" Это сообщение отредактировал(а) xXxSataNxXx - 27.2.2010, 18:09 |
|||
|
||||
| Pilger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 10.5.2008 Где: Германия Репутация: нет Всего: нет |
Согласен, для быстродействия в обработчике Paint лучше оставить только:
Но прислушайся к советам diadiavova. Это сообщение отредактировал(а) Pilger - 27.2.2010, 18:26 -------------------- Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert. |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
На счёт DrawPath я не думаю, что это хорошая идея, создание лишнего Disposable объекта при такой частой перерисовке - это лишние затраты ресурсов, думаю можно ограничиться DrawLines.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| ShamanK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 24.2.2010 Репутация: нет Всего: нет |
подскажите а как передвигать график?
к примеру есть двумерный массив с координатами точек. привязка графика к правой сторне, когда приходит новая цена мне необходимо передвинуть весь график влево на определенное число пикселей и нарисовать линию от предпоследней цены к только что пришедшей.. как это лучше сделать? удалить весь старый график ( как это делается ? ) и нарисовать новый с уже пришедшей ценой? и не будет ли при этом мерцания? или передвинуть влево старый график ( как это делается? ) и пририсовать к графику еще одну линию? Это сообщение отредактировал(а) ShamanK - 28.2.2010, 11:25 |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
Двумерный массив там не нужен. Тебе понадобится одномерный массив точек(идеальным вариантом будет собственный класс, который будет представлять линию на графике и содержать коллекцию точек за какой-то промежуток времени). Всякий раз при прорисовке контрола тебе надо будет нарисовать оси и прочие фоновые дела, после чего брать точки из этого массива(класса), который будет объявлен в контроле как внутренне поле и рисовать линию по этим точкам. Иными словами для того чтобы всё сдвинуть придётся перерисовать всё заново.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| ShamanK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 24.2.2010 Репутация: нет Всего: нет |
diadiavova, а можно хотябы небольшой пример. ибо то что вы написали мне понятно по логике а вот по умению написания вообще нихрена не понял..
если вас не затруднит небольшой пример такого класса, как это содержать коллекцию точек? оси и прочие дела не нужны )) как объявить массив (класс) как внутреннее поле контрола? мнеб самый простой примерчик чтобы "догнать" как это все происходит. |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
ShamanK, я набросал как примерно может выглядеть упомянутый класс, но сразу хочу оговориться: этот код не для копипасты, разберись как он устроен и приспособь к своей задаче. Общий принцип работы примерно следующий:
В экземпляр класса добавляются пары <Момент времени;Значение>(для них создана специальная структура). Экземпляр удерживает некоторое количество таких элементов, которое соответствует заданному промежутку времени(по умолчанию я задал удерживать все значения за последнюю минуту) и всякий раз при обновлении все более ранние элементы удаляются. Так же можно задать диапазон значений, который будет отображаться в контроле. Для преобразования пары "время-значение" в точку есть две функции, которые тебе придётся реализовать самому и возможно для их поддержки понадобятся дополнительные свойства. Ну и наконец есть функция, которая будет выдавать массив точек для отображения. В своём контроле объявишь переменную, которая будет держать такой объект и при прорисовке контрола используй его данные. Надеюсь разберёшься.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
![]()
|
| Правила форума VB .NET | |
|
|
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | VB .NET | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |