Fehler, Irrtümer, Fragen - Seite 2780

 
Sergey Dzyublik:

Die Schritte zum Spiel:

Es ist unmöglich, nicht Danke zu sagen für eine Arbeit wie diese! Hoffentlich bekommen wir eines Tages etwas Ähnliches für andere Fehler.

 
Sergey Dzyublik:

Weinen Sie nicht, es ist lange her, dass ich geantwortet habe:

Leider stellte sich heraus, dass die Leistung nicht nur gleich Null, sondern sogar negativ war...

Nun, warum negativ...
Ich habe es nicht beim ersten Mal verstanden, ich habe es nicht beim zweiten Mal verstanden, aber ich habe es beim dritten Mal verstanden.
Ich kann nichts dafür, dass ich so angespannt bin. Es ist nicht deine Schuld.
Sei also nicht beleidigt, Sergei.

 
Sergey Dzyublik:

Sie haben die Begriffe "asynchron" und "synchron" falsch verstanden.
Wenn Sie sagen, dass eine Funktion asynchron ist, bedeutet dies, dass sie nicht im aktuellen Thread der Ausführung, sondern in einem anderen Thread ausgeführt wird.

Der Aufruf einer asynchronen Funktion wie ChartSetInteger vom Hauptthread aus ist schnell, da die eigentliche Ausführung in einem anderen Thread erfolgt.
Andererseits erfordert der Aufruf einer synchronen ChartGetInteger-Funktion die Synchronisierung von Threads, was zusätzliche Zeit in Anspruch nehmen kann.
Die Verzögerungen machen sich besonders bemerkbar, wenn der parallele Thread die Daten der Diagrammstruktur ständig aktualisiert (z. B. wenn der Benutzer das Diagrammfenster bewegt oder durch den Verlauf blättert).
Der Einfachheit und Zuverlässigkeit halber wird wahrscheinlich ein einziges Synchronisationsobjekt für seine Diagrammdatenstruktur verwendet.
Man kann versuchen, die Ausführungsgeschwindigkeit durch "Datensegmentierung" zu verbessern, aber andererseits kann es jetzt zu Deadlocks, zu wenig aktualisierten Daten oder zu Verlangsamungen in anderen kritischeren Bereichen kommen.
Im Allgemeinen ist es besser, etwas, das bereits stabil läuft, nicht zu verändern.

Alain Verleyen:

Nein. Get-Methoden sind synchron, aber sie können gruppiert und gleichzeitig ausgeführt werden, so dass der Aufruf von Methode 1 Get oder 100 fast identisch ist.

Set-Methoden sind asynchron, können aber auch zur Steigerung der Effizienz gruppiert werden.

Daher ist es immer besser, "Set-Aufrufe zusammen" und "Get-Aufrufe zusammen" zu gruppieren als "Get / set / get / set / get / set".

Asynchrone Aufrufe sind effizienter, wenn der aufrufende Thread nicht blockiert wird, während die Funktion ausgeführt wird, aber Sie verlieren diese Vorteile, wenn Sie Get und Set mischen.

Ich hoffe, das hilft trotz der Übersetzung.

Aleksey Mavrin:

So wie ich es verstehe, ist Get synchron, da sie das angeforderte Ergebnis zurückgeben. Wenn Sie jedoch asynchrone Sets in der Warteschlange haben, müssen Sie diese synchronisieren.

Wenn sich nur Get's in der Warteschlange befinden, gibt es keine Verzögerung.

Ich danke Ihnen allen. Ich fange langsam an, den Dreh rauszukriegen.

Jetzt wird das wahre Bild dieser Verzögerungen deutlich.

So wie ich es verstehe (bitte korrigieren Sie mich, wenn ich falsch liege):

Wenn die Get-Methode vom Hauptthread aus aufgerufen wird, erfolgt eine Anfrage an den Chart-Thread selbst, der parallel zum Hauptthread läuft. Aber der Haupt-Thread wird direkt vom Haupt-Thread durch Set-Methoden gesteuert und der Haupt-Thread sollte den aktuellen Zustand des Chart-Threads bereits kennen, aber er kennt den aktuellen Zustand des Chart-Threads nicht und ist nicht sicher, ob die letzten Befehle ausgeführt wurden. Aus diesem Grund erfolgt diese Abfrage, um sicherzustellen, dass alle vorherigen Befehle ausgeführt worden sind. Da die Get-Methode synchron ist, wartet sie, bis eine Antwort vom parallelen Chart-Thread empfangen wird. Dies ist der Grund für die Verzögerungen.

Wenn ich keinen Fehler gemacht habe, stellt sich eine Frage:

Warum kann der Hauptthread dem Thread nicht mitteilen, dass sein Befehl ausgeführt wurde, so dass der Hauptthread den Befehl als ausgeführt markieren und seine interne Tabelle aktualisieren kann? Dann würde der Hauptthread die Daten aus der Tabelle zurückgeben, ohne Anfragen an den Hauptthread zu stellen. Außerdem können Sie dem parallelen Thread ein Flag übergeben, das besagt, dass es Befehle gibt, die noch nicht ausgeführt wurden, oder dass alle Befehle ausgeführt wurden, um den aktuellen Zustand des Diagramms zu verstehen. Bei dieser Regelung wird es keine Verzögerungen geben.

Ich habe einen ähnlichen Mechanismus in der iCanvas-Klasse implementiert.

Hier ist ein Indikator, der diesen Mechanismus demonstriert. Es gibt eine unglaublich langsame Funktion ChartXYToTimePrice, um Pixelkoordinaten mit der Chartzeit und dem Preis zu assoziieren und ihr Analogon, die Funktion XYToTimePrice, zu erstellen, die ihre internen statischen Variablen beim CHARTEVENT_CHART_CHANGE-Ereignis aktualisiert und die angeforderten Parameter auf der Grundlage von Daten aus diesem statischen Chart der Chartparameter berechnet.



Dateien:
TestSpeedXY.mq5  16 kb
 
Kommentare, die sich nicht auf dieses Thema beziehen, wurden nach "Fragen von MQL5 MT5 MetaTrader 5 Anfängern" verschoben.
 
Nikolai Semko :

Ich danke Ihnen allen. Ich fange langsam an, den Dreh rauszukriegen.

...
Das ist richtig. Und wie Renat sagte, muss das Cache-System auf der mql-Seite implementiert werden. Vielleicht könnte es auf der Plattformseite implementiert werden, aber das würde das Erreichen einer möglichst leistungsfähigen Multithreading-Architektur gefährden.
 
Alain Verleyen:
Das ist wahr. Und, wie Renat sagte, muss das Cache-System auf der mql-Seite implementiert werden. Vielleicht könnte sie auf der Plattformseite implementiert werden, aber das würde die Erreichung einer möglichst produktiven Multithreading-Architektur gefährden.

Ich verstehe.
Umso besser für diejenigen, die wissen, wie man dieses Cache-System implementiert, und umso schlechter für diejenigen, die es nicht verstehen.

 
Nikolai Semko:

Ich werde versuchen, eine Analogie zu verwenden, und wenn es nicht so funktioniert, dann ist das eben so.
Das ist alles sehr übertrieben und nicht wahr, aber trotzdem.


Es gibt Sie, den Kunden, der die Farben bestimmt und zum Künstler bringt, und es gibt den Künstler, der die von Ihnen mitgebrachten Farben verwendet und damit die Leinwand bemalt.
Nachdem Sie die Farben mitgebracht haben, können Sie Ihren Geschäften nachgehen: Arbeit, Zuhause, Schule, .....
Sie können den Maler auch jederzeit besuchen und das Ergebnis begutachten.
Wenn Sie jedoch zu einer Besichtigung kommen, während der Künstler malt, müssen Sie warten, bis der Künstler seine Arbeit beendet hat.


Die beste Art der Interaktion besteht darin, dem Maler alle benötigten Farben zu bringen, ihn zum Malen aufzufordern und dann seiner Arbeit nachzugehen.
Am Ende können Sie, wenn nötig, den Maler so oft wie nötig besuchen, um die Leinwände zu inspizieren.

Die suboptimalste Art der Interaktion besteht darin, dem Maler eine Farbe nach der anderen zu bringen und dann sofort das Ergebnis zu verlangen und jedes Mal zu warten, bis der Maler seine Arbeit beendet hat.

Was ist das Problem in 2485 im Vergleich zu den 2009 bauen:
Künstler näher an Sie bewegt, begann die Reisezeit für die Inspektion zu verbringen weniger, was ein Plus ist.
Allerdings hat der Künstler begonnen, viel Zeit für "Teilzeit"-Arbeiten nebenbei zu verwenden.
Früher hat er genauso häufig "Nebenjobs" angenommen, aber jetzt muss man zu lange warten, bis der Künstler die Arbeit beendet hat.

 
Nikolai Semko :

Ich verstehe.
Umso besser für diejenigen, die wissen, wie man dieses Cache-System implementiert, und umso schlechter für diejenigen, die es nicht verstehen.

Rechts
 
Sergey Dzyublik:


Die beste Art der Interaktion ist, dem Maler alle benötigten Farben zu bringen, ihn mit dem Malen zu beauftragen und dann seine Arbeit zu erledigen.
Am Ende können Sie, wenn nötig, den Maler für eine Inspektion besuchen, so oft Sie wollen - Sie werden freien Zugang zur Leinwand haben.

Meiner Meinung nach ist es am besten, mit dem Künstler zu vereinbaren, dass er, sobald er ein Gemälde fertiggestellt hat, ein bestimmtes fertiges Werk auf seiner Website angibt, das besichtigt werden kann, und dass er auch seinen aktuellen Status angibt - ob er nebenberuflich oder frei arbeitet.
Dann wissen Sie, welches Bild fertig ist und welches nicht, ohne den Künstler zu besuchen, und wenn der Künstler im Moment beschäftigt oder frei ist, können Sie ihm den nächsten Auftrag schicken. Und bei einer Inspektion muss man nicht umsonst reisen. Das spart Zeit und Nerven, sowohl für den Kunden als auch für den Künstler.

 
Nikolai Semko:

1) Meiner Meinung nach ist der beste Weg, um mit dem Künstler zu vereinbaren,
2), sobald er einige regelmäßige Malerei beendet,
3), dann hat er sofort auf eine bestimmte Arbeit auf ihrer Website, die für die Anzeige durch den Kunden zur Verfügung steht,
4) sowie zustimmen, auf der Website der aktuellen Status angeben - es ist beschäftigt Schwarzarbeit oder frei.
5) Dann wird der Kunde wissen, .... Wenn der Künstler gerade beschäftigt oder frei ist, können Sie ihm den nächsten Auftrag schicken.
6) Und es wird nicht nötig sein, mit der Inspektion umsonst zu reisen. Das spart Zeit und Nerven, sowohl für den Kunden als auch für den Künstler.

1) Der Künstler kennt deine Pläne nicht und du kennst auch nicht die Zukunft...
2) Es gibt keine Gemälde, sondern nur eine Leinwand, auf der alle Manipulationen und "Basteleien" stattfinden.
3) Wer in eine Analogie Prozesse einführt, die nichts mit dem Ausgangsmaterial zu tun haben, hat nicht verstanden, was eine Analogie ist und wozu sie dient.
4) Ein Maler kennt die Zukunft nicht, und wenn Sie zu einer Inspektion kommen müssen, kann sich sein Status während der Reise hundertmal ändern.
5) Sie können jederzeit Farbe einbringen, es dauert immer gleich lang, unabhängig vom Status des Künstlers oder seiner Beschäftigung.
6) Sie haben wieder einmal nicht verstanden, was eine Analogie eigentlich ist und wozu sie dient...