как создавать объекты динамически? (Некоторые вопросы ООП) - страница 5

 
Doerk Hilger:

2. Framework from scratch.

Similar here. When I started to go a bit deeper into the standard libraries I found many things, which I did not like. Not only the bad performance of those, but also lack of flexibility and also because of an incomplete architecture. I am missing for example a global CMouse class/object as well as a class between CWnd and CObject, because CWnd objects are childs of the chart as well as lines are, and there is no connection to such and no final implementation of any such objects at all like I described it above. And, there is no master object, which holds all such chart objects which makes it possible to show/hide all of them with one command, destroy them, whatever. CCanvas, same thing, a nice class but where is the implementation with CWnd which allows me to create interactive objects based on bitmaps that inherit from CWnd? And so on. 




Какова роль глобального CMouse? Служит ли он конечному пользователю только как отдельный класс, чтобы получить легкий доступ к управлению мышью? Как он связан с фреймворком?
Что касается класса между CWnd и CObject, я не понимаю, почему вы считаете их необходимыми. Объекты CWnd являются дочерними для графика, как и линии - я не понимаю, в чем проблема, и почему нет связи?
Вы также говорите, что нет окончательной реализации таких объектов, как вы описали выше? (где вы описали?)

 

Возможность глобального объекта мыши, по крайней мере в моем GUI, состоит в том, чтобы сохранить любую информацию о мыши (положение, положение нажатия, цена положения и т.д.), доступную для каждого класса, работающего с такой информацией. Кроме того, объект мыши хранит информацию об эксклюзивном использовании мыши, например, при перетаскивании. Это просто экономит много процессорного времени, пока что-то перетаскивается или собирается быть нажатым и т.д.

И последнее, но не менее важное: Ничто из стандартной библиотеки не работает в тестере стратегий при использовании в советниках, потому что нет событий мыши. И если вы хотите реализовать поддержку мыши в тестере стратегий, вы будете благодарны за такой класс мыши, потому что классу не важно, откуда берется информация о движении мыши, но объекты, которым нужна эта информация, все равно знают, где их искать.

---

Мне не хватает не только класса между CWnd и CObject, мне не хватает главного объекта/контейнера, который хранит объекты на основе пикселей, а также объекты на основе времени/цены. Как вы упомянули, все они являются объектами графика, поэтому логическим мастером должен быть объект, который представляет график и который содержит все объекты. И чтобы реализовать это, должен быть класс между CWnd и CObject.

В основе этой идеи лежит не только логика, но и вопрос производительности. В моем случае, когда график как-то меняется, мастер-объект обнаруживает это, он обходит все содержащиеся объекты, которые могут быть контейнерами линий, контейнерами CWnd, а также любыми отдельными объектами любого из этих типов, и "информирует" любой объект, который хочет быть проинформированным об этом. Это означает, что в коде есть один единственный цикл в одной точке, и благодаря использованию контейнеров и подконтейнеров это чрезвычайно эффективно.

Я также использую этот мастер для замораживания всех объектов сразу и предотвращения любых физических обновлений всего одной строкой кода. Разница в производительности радикальна. Пример: Когда я создаю все визуальные объекты, необходимые для моего эксперта, а в некоторых случаях их более 1000, я замораживаю этот мастер-объект заранее, создаю другие объекты и "размораживаю" его после этого, что приводит к одному физическому обновлению графика. Без замораживания этот процесс может занять целую минуту. С заморозкой он занимает менее 2 секунд.

Прежде чем я начал создавать GUI самостоятельно, я действительно попробовал его со стандартными библиотеками. Позже я попытался сохранить хотя бы некоторые части. Но проблема была в том, что просто невозможно было реализовать то, что я задумал, из-за неполной реализации и архитектуры, которая как бы ... LetsMakeSomethingThatWorksSomehowForWeDontKnow. Визуальная производительность достигается с помощью четкой иерархии, но стандартные библиотеки как-то анархичны.

В любом случае, я не первый, кто это понял. И, как уже упоминал Ален, я не уверен, что это действительно поможет, потому что это слишком теоретично. Я просто могу рассказать о своем опыте работы со всем этим, который основан не только на MQL, но мое мнение - это всего лишь мое мнение и, конечно, не закон.

 
Во-первых, я не согласен, что она слишком теоретическая. Я думаю, что она очень глубокая. Я могу согласиться с тем, что она теоретическая для людей, которые не заинтересованы в создании фреймворков и просто должны использовать их для создания интерфейсной панели.

Но для второго типа людей образ мышления и соображения, обсуждаемые здесь, очень ценны и очень практичны. Конечно, статья была бы лучше, но тем не менее.
Я не думаю, что люди будут строить фреймворки, прочитав только эту тему, но все же в ней есть хорошая информация и соображения, которых, кажется, не хватает даже тем, кто уже построил публичные MQL-фреймворки.

Итак, для мыши и тестера, если я правильно вас понял, вы используете ::OnTester() для вызова мыши вместо пользовательского ввода, если я вас понял.

Еще раз спасибо, Doerk.
 
Doerk Hilger:

Возможность глобального объекта мыши, по крайней мере в моем GUI, состоит в том, чтобы сохранить любую информацию о мыши (положение, положение нажатия, цена положения и т.д.), доступную для каждого класса, работающего с такой информацией. Кроме того, объект мыши хранит информацию об эксклюзивном использовании мыши, например, при перетаскивании. Это просто экономит много процессорного времени, пока что-то перетаскивается или собирается быть нажатым и т.д.

И последнее, но не менее важное: Ничто из стандартной библиотеки не работает в тестере стратегий при использовании в советниках, потому что нет событий мыши. И если вы хотите реализовать поддержку мыши в тестере стратегий, вы будете благодарны за такой класс мыши, потому что классу не важно, откуда берется информация о движении мыши, но объекты, которым нужна эта информация, все равно знают, где ее искать.

Предположим, что глобальная мышь заметила щелчок на объекте, из вашего описания следует, что сам объект должен искать эту информацию в классе мыши - разве мышь не должна уведомить об этом объект (перемещением по событию)? Если да, то где экономия процессорного времени? Если нет, то как объект не пропускает событие мыши, например, я нажал на кнопку, а затем на комбобокс, моя мышь не уведомила кнопку о том, что она была нажата, и теперь у мыши есть последний объект, на который она нажала, как комбобокс. Значит, должно быть так, что мышь передает событие object was clicked. Таким образом, вместо того, чтобы событие "объект щелкнул" приходило прямо из MT5 в класс контрола, оно приходит к мыши, а затем к контролу, где экономия процессора?

Или я что-то упускаю?
 

Объект мыши не смотрит сам, находится ли он над объектом или используется ли он в данный момент объектом, это делают сами объекты. Но объект мыши является центральным "местом", где может храниться такая информация.

Стандартные классы управления работают таким образом, что при каждом движении мыши все объекты зацикливаются, чтобы выяснить, имеет ли это движение какое-то отношение к ним, это занимает много процессорного времени, что можно легко увидеть, если запустить диспетчер задач и просто подвигать мышью, когда загружен советник или индикатор, и объект CDialog является частью советника или индикатора. Чем сложнее диалог, тем выше загрузка процессора.

В моем GUI, благодаря существованию глобального объекта мыши, это делается по-другому. У вас может быть 10000 объектов, а использование процессора при перемещении мыши не растет. Это сделано таким образом, что только как только кнопка мыши опустилась на определенный объект, этот один конкретный объект сообщает объекту мыши, что он имеет фокус, и как только мышь перемещается после этого события нажатия кнопки, никакому другому объекту не нужно заботиться об этом, и любое дальнейшее движение мыши / любое дальнейшее событие перемещения мыши направляется непосредственно на объект, который имеет фокус - который всегда эксклюзивный - с помощью его указателя.

И в силу того обстоятельства, что все объекты графика, независимо от того, основаны ли они на времени/цене (линии тренда и т.д.) или на пиксельных координатах (панели и т.д.), имеют общий базовый класс, все эти объекты могут использовать общий набор перегруженных функций для обработки этого. Это также причина, по которой я упомянул, что между CWnd и CObject отсутствует класс, потому что этот базовый класс между является тем же базовым классом, который используется объектами, основанными на времени/цене, и только это позволяет эффективно взаимодействовать и эффективно обрабатывать такие события.

 
Таким образом, фактически, вы отказываетесь от прослушивания движений мыши (если только они не следуют непосредственно за щелчком объекта), и просто уделяете внимание щелчку мыши и перетаскиванию мыши. Что касается щелчка мыши, то он делается так же, как и в стандартной lib, объект сам определяет щелчок, но затем он хочет быть готовым к перетаскиванию, поэтому он уведомляет мышь, которая, вероятно, сохраняет свое местоположение и дальнейшее перетаскивание вызывает обратно объект. Если мышь случайно поднимает кнопку без перетаскивания, она просто перестает фокусироваться на объекте, на котором щелкнули, удаляя указатель объекта. Таким образом, объекты слушают щелчки, а мышь слушает перетаскивания.
Значит, все сводится к тому, что движения мыши фактически игнорируются как неважные, если только они не произошли непосредственно перед щелчком объекта?
 

Да.

Тем не менее, у меня есть возможность отлавливать любые движения, если нажать или нет, а также с лучшей производительностью процессора и без использования имен объектов, но здесь вопрос был не в этом.

 
Да, теперь я вижу картину, которую вы пытались передать, и, конечно, есть способы, чтобы движения мыши также прослушивались самой мышью, без необходимости зацикливания объектов. И это может даже уведомлять объекты, когда они находятся в фокусе, используя только их указатели, так как они регистрируются как слушатели.
Причина обращения: