Asynchrone und mehrfädige Programmierung in MQL - Seite 14

 
Реter Konow:

Ist es wirklich so gefährlich? Fehler bei der Speicherfreigabe...

Das Beispiel bezieht sich auf die allgemeinen Grundsätze der Erfassung des Gerätekontexts und der zugewiesenen Ressourcen in Windows. Bei der Programmierung unabhängiger Threads muss der Entwickler sicherstellen, dass der Gerätekontext und die Ressourcen freigegeben werden, wenn dies vom Betriebssystem verlangt wird; wenn der Entwickler Befehle auf niedriger Ebene verwendet, muss er alle verwendeten Ressourcen selbst freigeben... hier noch einmal zu dem Punkt, den ich geschrieben habe - schreiben Sie einmal mit gegoogelten Informationen "Hello World"https://www.mql5.com/ru/forum/318593/page5#comment_12572558 und Sie werden eine Menge verstehen, Sie werden verstehen, dass 99% der Arbeit für Sie von Systemprogrammierern gemacht wurde

D.h. das Arbeiten in der MQL-Umgebung - die Metakvot-Programmierer haben es für Sie getan - sie haben dafür gesorgt, dass das Terminal funktioniert, falls das MQL-Programm nicht richtig funktioniert

 
Andrey Pogoreltsev:

Multithreading - Aufgaben werden in mehreren Threads ausgeführt. Kann auf einem einzigen Prozessor ausgeführt werden, wobei das Multithreading erhalten bleibt und zwischen den Prozessoren umgeschaltet wird, wenn die Prozessorzeitkontingente erschöpft sind. Erfordert Synchronisierung für den Zugriff auf gemeinsame Ressourcen. Kann zu Deadlocks, Race Conditions, Speicherfreigabefehlern und anderen "Überraschungen" führen.

Asynchron - nicht blockierte Funktionsausführung (d.h. die Kontrolle wird unmittelbar nach Beendigung der Methode zurückgegeben), in der Regel auf anderen Geräten (Netzwerkgeräten, Speichergeräten, Peripheriegeräten usw.). So ist es z.B. möglich, einen leistungsstarken Mehrbenutzerserver zu schreiben, der nur einen Thread und Client-Verbindungen für die Endgeräteverarbeitung verwendet. Es hängt alles vom Zweck des Servers ab.

In Ihrem Fall müssen Sie eine große Anzahl von Verbindungen mit WinAPI erstellen und Sie können den Status dieser Verbindungen mit WaitForMultipleObjects mit einem Timeout überprüfen, so dass Sie nicht einen Timer-Thread halten müssen, zum Beispiel.

PS: Theoretisch könnte man auch IOCompletionPort verwenden, aber das erfordert mehr Wissen und einen sorgfältigen Entwurf.

Na ja... ihr habt euch gefunden.

 
Vielleicht haben die Menschen nicht genug Vitamine oder Mikronährstoffe...
 
Roman:

Danke für die informative Antwort ))
Erläutern Sie bitte, was sich wo befindet.
Und wie schreibt man asynchronen Code mitEventloop mit Standardmitteln?

Das steht alles in der Dokumentation.

Sie können damit beginnen, sie zu lesen und zu versuchen, etwas zu schreiben.

Und wenn Sie das nicht können, können Sie im Forum fragen.

Bis jetzt haben wir über nichts gesprochen.


 
Koldun Zloy:

Das steht alles in der Dokumentation.

Sie können damit beginnen, sie zu lesen und zu versuchen, etwas zu schreiben.

Und wenn Sie das nicht können, können Sie im Forum fragen.

Bis jetzt haben wir über nichts gesprochen.


Wozu wurde das Thema Ihrer Meinung nach geschaffen?
Sie sagen uns, wie man asynchronen Code auf die übliche Weise schreibt, und zeigen es in der Dokumentation.
Neben dem asynchronen Senden von Anfragen zeigen Sie, wo Callback-Funktionen, wo die Steuerung von EventLoop, wo Warten, etc.
Ich bin mir sicher, dass Sie diese Frage nicht beantworten können, da es keine solche Funktion für Benutzer gibt und sie auch nicht in den Dokumenten enthalten ist.
Genau genommen geht es in dem Gespräch um nichts, die einzige Person hier im Thread istAndrey Pogoreltsev, der etwas vom Thema Kommunikation versteht.

 
Euentloop! Hat jemand einen Euentloop? Ohne einen Euentloop geht es einem Mann hier nicht gut! Kann mir jemand einen Euentloop geben?
 

Roman, 2019.07.27 09:30

Wozu wurde das Thema Ihrer Meinung nach geschaffen?


Sie fragten nach Multithreading. Es gibt keine.

Aber das ist auch nicht das, worüber Sie sich im Moment Sorgen machen müssen.

Roman, 2019.07.27 09:30

Sie sagen uns, wie man asynchronen Code mit den Standardmitteln schreibt und zeigen es in der Dokumentation.
Zeigen Sie uns neben dem asynchronen Senden von Anfragen auch, wo Callback-Funktionen, wo die Steuerung von EventLoop, wo Wait, etc.
Ich bin mir sicher, dass Sie darauf keine Antwort geben können, da es diese Funktion für Benutzer nicht gibt und sie auch nicht in den Dokumenten enthalten ist.
Genau genommen geht es in dem Gespräch um nichts, die einzige Person hier im Thread ist Andrey Pogoreltsev, der etwas vom Thema Kommunikation versteht.

Ich kann Ihnen das alles zeigen. Aber was soll das bringen?

Wenn Sie es brauchten, würden Sie es selbst finden.

Offensichtlich haben Sie die Dokumentation oder die Artikel nicht gelesen.
 
Koldun Zloy:

Sie fragten nach Multithreading. Es gibt kein Multithreading.

Das Multi-Threading ist wiehttps://www.mql5.com/ru/docs/runtime/running , d.h. wir wollen die Aufgabe parallelisieren, mehrere Graphen öffnen (leider habe ich noch nicht versucht, die Services-Funktionen zu nutzen - vielleicht wird es damit noch einfacher? ) und hängen unsere EAs, die in separaten Threads arbeiten, an diese an und lösen dann das Problem der Synchronisierung und des Datenaustauschs (Tasks)

Ich habe TS fünfmal gefragt, warum das Handelsterminal es braucht... er weiß es nicht, weil es keine spezifische Aufgabe oder kein spezifisches Ziel gibt

Ich sehe es in Client-Server-Anwendungen, die nicht typisch für den Handel Terminal ist, vielleicht ist es bequem für jemanden, um Statistiken an den Server zu senden? - Nun, ich habe bereits ein fertiges Beispiel geschrieben (Artikel)https://www.mql5.com/ru/articles/5337

Die Quellen sind gut lesbar und der Artikel hat eine ausgezeichnete Qualität; die Quellen können modifiziert werden, um parallele Berechnungen in mehreren Threads durchzuführen.... Was sollen wir nun berechnen? )))

 
Igor Makanu:

Das Beispiel bezieht sich auf die allgemeinen Prinzipien der Erfassung des Gerätekontexts und der zugewiesenen Ressourcen in Windows. Bei der Programmierung unabhängiger Threads muss der Entwickler sicherstellen, dass der Gerätekontext und die Ressourcen freigegeben werden, wenn dies vom Betriebssystem verlangt wird; wenn der Entwickler Befehle auf niedriger Ebene verwendet, muss er alle verwendeten Ressourcen selbst freigeben... hier noch einmal zu dem Punkt, den ich geschrieben habe - schreiben Sie einmal mit gegoogelten Informationen "Hello World" https://www.mql5.com/ru/forum/318593/page5#comment_12572558 und Sie werden eine Menge verstehen, Sie werden verstehen, dass 99% der Arbeit für Sie von Systemprogrammierern gemacht wurde

Mit anderen Worten, die Arbeit in der MQL-Umgebung Metakvot Programmierer tat es für Sie - sie sicherte den stabilen Betrieb des Terminals mit unzureichender Arbeit der MQL-Programme

OK, keine Argumente, überzeugt. Für Autodidakten ist es unter Umständen nicht möglich, die Fäden selbst in die Hand zu nehmen, was zu kritischen Fehlern führen kann. "Streichhölzer sind kein Spielzeug für Kinder". Wir brauchen jedoch eine Möglichkeit, Multithreading innerhalb eines einzigen Programms zu erreichen.

Es gibt eine einfache Logik: Der sequenzielle Start von Diensten verursacht keine Fehler, und jeder Dienst läuft in seinem eigenen Thread. Der Mechanismus ist also bereits konfiguriert und fehlerfrei. Gut. Wir müssen einen Schritt nach vorne machen: diese Dienste in den Code des Expert Advisors in spezielle Module schreiben. Jedes Modul wird die gleiche Dienstleistung sein. Dann sollten wir diese Module nacheinander kompilieren und gleichzeitig ausführen. Das war's.

Im Grunde genommen ändert sich nichts. Nur die Dienste werden in den Eulencode geschrieben. Sie würden auf die gleiche Weise kompiliert und funktionieren. Sie werden gelöscht, wenn der EA aus dem Diagramm entfernt wird. Auf diese Weise erhalten wir einen Multithreading-EA.

 
Sie können es noch einfacher machen. Der Expert Advisor lädt die benötigten Dienste selbst, die separat geschrieben werden. Wenn sie aus der Karte entfernt werden, werden sie gestoppt. Das Einzige, was Sie tun müssen, ist, den Start der Dienste des Expert Advisors hinzuzufügen. Und die interne Interaktion zwischen den Threads ist Aufgabe des Programmierers. Sie wird mit Hilfe von Ressourcen gelöst.