come creare oggetti in modo dinamico? (Alcune cose OOP) - pagina 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. 




Qual è il ruolo di un CMouse globale? Serve all'utente finale solo come classe autonoma, per avere un facile accesso alla gestione del mouse? Come si relaziona con il framework?
Per quanto riguarda la classe tra CWnd e CObject, non seguo la tua spiegazione sul perché li hai trovati necessari. Gli oggetti CWnd sono figli del grafico, così come le linee - non capisco il problema in questo, e perché non c'è connessione?
Dici anche che non c'è alcuna implementazione finale di tali oggetti come hai descritto sopra? (dove hai descritto?)

 

L'opportunità di un oggetto mouse globale è, almeno nella mia GUI, di salvare tutte le informazioni sul mouse (posizione, posizione di pressione, prezzo della posizione ecc. Inoltre l'oggetto mouse contiene informazioni sull'uso esclusivo del mouse, per esempio quando si trascina. Questo fa risparmiare molto tempo alla CPU mentre qualcosa viene trascinato o sta per essere cliccato ecc.

Ultimo ma non meno importante: Niente della libreria standard funziona in strategy tester quando viene usato negli EA perché non ci sono eventi del mouse. E se volete implementare il supporto al mouse in strategy tester, sarete grati anche per una tale classe per il mouse, perché la classe non si preoccupa da dove provengono le informazioni sui movimenti del mouse, ma gli oggetti che hanno bisogno delle informazioni sanno ancora dove devono cercare.

---

Non è solo la classe tra CWnd e CObject che mi manca, in realtà è più l'oggetto/contenitore master mancante che contiene oggetti basati sui pixel e oggetti basati sul tempo/prezzo. Come hai detto anche tu, sono tutti oggetti del grafico, quindi il master logico dovrebbe essere un oggetto che rappresenta il grafico e che contiene tutti gli oggetti. E per realizzare ciò, ci deve essere una classe tra CWnd e CObject.

Lo sfondo di questa idea non è solo la logica, è anche una questione di prestazioni. Nel mio caso, quando il grafico cambia in qualche modo, l'oggetto master lo rileva, mette in loop tutti gli oggetti contenuti che possono essere contenitori di linee, contenitori di CWnd così come ogni singolo oggetto di uno di questi tipi, e "informa" ogni oggetto che vuole essere informato da questo. Questo significa solo che c'è un unico ciclo esattamente in un punto del codice, e a causa dell'uso con contenitori e sottocontenitori, questo è estremamente efficiente.

Uso anche questo master per congelare tutti gli oggetti in una volta e per prevenire qualsiasi aggiornamento fisico con una sola linea di codice. La differenza di prestazioni è drastica. Esempio: Quando creo tutti gli oggetti visivi di cui ho bisogno per il mio EA, e in alcuni casi questi sono più di 1000, congelo questo oggetto master in anticipo, creo gli altri oggetti e lo "scongelo" dopo, il che si traduce in un aggiornamento fisico del grafico. Senza congelamento, questo processo può richiedere un intero minuto. Con il congelamento, è meno di 2 secondi.

Prima di iniziare a creare la GUI da solo, ho provato davvero con le libs standard. In seguito, ho cercato di mantenere almeno alcune parti. Ma il problema era che era semplicemente impossibile realizzare ciò che avevo in mente a causa di un'implementazione incompleta e un'architettura che è un po' ... LetsMakeSomethingThatWorksSomehowForWeDontKnow. La performance visiva è raggiunta con una chiara gerarchia, ma le librerie standard sono in qualche modo anarchiche.

Comunque, non sono la prima persona che ha riconosciuto questo. E come Alain ha già menzionato, non sono sicuro che questo aiuti davvero, perché è troppo teorico. Posso solo parlare della mia esperienza con tutta questa roba che non è solo basata su MQL, ma la mia opinione è comunque solo la mia opinione e naturalmente non è legge.

 
Innanzitutto, non sono d'accordo che sia troppo teorico. Penso che sia molto perspicace. Sono d'accordo che sia teorico per le persone che non sono interessate a costruire framework e hanno solo bisogno di usarli per costruire un pannello di interfaccia.

Ma per il secondo tipo, il modo di pensare e le considerazioni discusse qui sono molto preziose e anche molto pratiche. Naturalmente un articolo sarebbe meglio, ma comunque.
Non credo che la gente costruirà quadri dopo aver letto solo questo thread, ma ha ancora buoni pezzi di informazioni e intuizioni, che sembra che mancano anche per le persone che hanno già costruito quadri MQL pubblici.

Quindi, per il mouse e il tester se ho capito bene si usa il ::OnTester() per chiamare il mouse invece di un input utente, se ti seguo.

Grazie ancora, Doerk.
 
Doerk Hilger:

L'opportunità di un oggetto mouse globale è, almeno nella mia GUI, di salvare tutte le informazioni sul mouse (posizione, posizione di pressione, prezzo della posizione ecc. Inoltre l'oggetto mouse contiene informazioni sull'uso esclusivo del mouse, per esempio quando si trascina. Questo fa risparmiare molto tempo alla CPU mentre qualcosa viene trascinato o sta per essere cliccato ecc.

Ultimo ma non meno importante: Niente della libreria standard funziona in strategy tester quando viene usato negli EA perché non ci sono eventi del mouse. E se volete implementare il supporto al mouse in strategy tester, sarete grati anche per una classe mouse, perché la classe non si preoccupa di dove provengono le informazioni sui movimenti del mouse, ma gli oggetti che hanno bisogno di queste informazioni sanno comunque dove devono cercare.

Supponiamo che il mouse globale abbia notato un clic su un oggetto, dalla tua descrizione, l'oggetto stesso deve cercare quell'informazione nella classe del mouse - il mouse non deve notificare l'oggetto (spostandosi sull'evento) all'oggetto? Se lo fa, allora dov'è il tempo di CPU risparmiato? Se non lo fa, allora come fa l'oggetto a non perdere un evento del mouse, per esempio ho cliccato su un pulsante e poi su una casella combinata, il mio mouse non ha notificato il pulsante che è stato cliccato e ora il mouse ha l'ultimo oggetto cliccato come la casella combinata. Quindi, deve essere che il mouse passa su un oggetto è stato cliccato evento. Quindi, invece dell'evento oggetto cliccato che arriva direttamente da MT5 alla classe di controllo, arriva al mouse e poi in avanti al controllo, dov'è il risparmio di CPU?

O mi manca qualcosa?
 

L'oggetto mouse non guarda se è sopra un oggetto o se è attualmente in uso da un oggetto, questo viene fatto dagli oggetti stessi. Ma l'oggetto mouse è il "luogo" centrale dove tali informazioni possono essere memorizzate.

Le classi di controllo standard funzionano così, che ad ogni movimento del mouse tutti gli oggetti sono messi in loop per capire se questo movimento ha qualcosa a che fare con loro, questo richiede molto tempo di CPU che può essere visto facilmente quando si avvia il task manager e basta muovere il mouse quando un EA o un indicatore è caricato e un oggetto CDialog è parte dell'EA o dell'indicatore. Più complessa è la finestra di dialogo, maggiore è l'utilizzo della CPU.

Nella mia GUI, con l'esistenza di un oggetto mouse globale, questo viene fatto diversamente. Puoi avere 10000 oggetti e l'utilizzo della CPU non cresce affatto quando il mouse viene spostato. È fatto in questo modo, che solo appena il pulsante del mouse scende su un oggetto specifico, questo specifico oggetto informa l'oggetto mouse che ha il focus, e appena il mouse si muove dopo questo evento di button-down, nessun altro oggetto ha bisogno di occuparsene, e ogni ulteriore movimento del mouse / ogni ulteriore evento di mouse-move è indirizzato direttamente all'oggetto che ha il focus - che è sempre esclusivo - usando il suo puntatore.

E per la circostanza che tutti gli oggetti grafici, non importa se questi sono basati su tempo/prezzo (linee di tendenza ecc.) o su coordinate pixel (pannelli ecc.) hanno una classe base comune, tutti questi oggetti possono usare un insieme comune di funzioni sovraccaricate per gestire questo. Questo è anche il motivo per cui ho detto che manca una classe tra CWnd e CObject, perché questa classe di base tra è la stessa classe di base che è usata anche dagli oggetti basati su tempo/prezzo e solo questo rende possibile comunicare efficacemente e gestire efficacemente tali eventi.

 
quindi in realtà, si rinuncia ad ascoltare i movimenti del mouse (a meno che non seguano direttamente il clic di un oggetto), e si pone attenzione solo al clic e al trascinamento del mouse. Per quanto riguarda il clic del mouse, viene fatto come nella lib standard, l'oggetto stesso rileva il clic, ma poi vuole essere preparato per il trascinamento, quindi lo notifica al mouse che probabilmente mantiene la sua posizione e un ulteriore trascinamento viene richiamato all'oggetto. Se il mouse solleva il pulsante senza trascinarlo, smette semplicemente di concentrarsi sull'oggetto cliccato cancellando il puntatore dell'oggetto. Quindi gli oggetti ascoltano i clic e il mouse ascolta i trascinamenti.
Quindi si riduce a questo che i movimenti del mouse sono effettivamente ignorati come non importanti a meno che non sia stato cliccato un oggetto?
 

Sì.

Tuttavia ho la possibilità di catturare qualsiasi movimento se cliccato o meno, e anche con migliori prestazioni della CPU e senza usare i nomi degli oggetti, ma non era questa la domanda qui.

 
Sì, ora vedo l'immagine che hai cercato di comunicare e sicuramente ci sono modi per avere anche i movimenti del mouse ascoltati dal mouse stesso, senza bisogno di mettere in loop gli oggetti. E si può anche notificare agli oggetti quando sono a fuoco con solo i loro puntatori usati come ascoltatori.