Asynchrone und mehrfädige Programmierung in MQL - Seite 24

 
Roman:

Ich habe nicht studiert, um Programmierer zu werden, ich lerne alles selbst, also schmeißt mich nicht raus ))

Ich auch nicht. Ich habe einen anderen Beruf. Programmieren ist nur ein Werkzeug, wie ein Hammer).

Erstellen von DLL für MKL - es ist absolut Standard-DLL, keine besonderen Merkmale. Der Rest ist reines C++, oder reines C#, wenn Sie so wollen.

C++ oder Sharp zu unterrichten, übersteigt meinen Horizont, aber es gibt jede Menge Literatur, egal auf welchem Niveau.

Es gibt einen Artikel auf MKL über die Erstellung einer einfachen DLL, ich kann nicht sagen, ob er informativ ist. Ja, und Google, um bei der Abfrage zu helfen - C++ DLL-Erstellung.

Apropos Einstiegspunkt und so weiter. In Visual Studio erstellen Sie ein DLL-Projekt, und alles, was Sie brauchen, wird von Ihnen selbst erstellt (fassen Sie es nur nicht mit den Händen an). Nun, während die Interaktionsfunktionen, Threads usw. Ihnen überlassen bleiben. - sind Ihnen überlassen. Dies ist C++, keine derartigen Funktionen speziell mit der DLL verbunden.

SZY Am besten lernt man etwas, wenn man eine bestimmte Aufgabe löst. Sie wurde nicht einmal von mir erfunden).

 
Yuriy Asaulenko:

Ich weiß es auch nicht. Ich habe einen anderen Beruf. Programmieren ist nur ein Werkzeug, wie ein Hammer).

Erstellen von Dlls für MKL - absolute Standard-Dlls, keine besonderen Merkmale. Der Rest ist reines C++, oder reines C#, wenn Sie so wollen.

C++ oder Sharp zu unterrichten, übersteigt meinen Horizont, aber es gibt jede Menge Literatur, egal auf welchem Niveau.

Es gibt einen Artikel auf MKL über die Erstellung einer einfachen DLL, ich kann nicht sagen, ob er informativ ist. Ja, und Google, um bei der Abfrage zu helfen - C++ DLL-Erstellung.

Apropos Einstiegspunkt und so weiter. In Visual Studio wird ein DLL-Projekt erstellt, und alles, was Sie brauchen, wird von selbst erstellt (berühren Sie es nur nicht mit den Händen). Und die Interaktionsfunktionen, Themen usw. sind Ihnen überlassen. - sind Ihnen überlassen. Dies ist C++, es gibt keine solchen Funktionen, die speziell mit der DLL verbunden sind.

Ja, ich kann die DLL selbst schreiben, mit einem leeren Einstiegspunkt))
Aber die Informationen über den Einstiegspunkt sind nirgends, nur blechern, kein google gibt, keine Literatur ähnlich ((.
Ich habe genau ein Problem mit dem Einstiegspunkt, wie Sie schreiben Interaktion Funktionen, Initialisierung, Speicherzuweisung, Threads, Deinitialisierung, etc.
Ich weiß, dass all dies in einem Schalter am Einstiegspunkt implementiert ist, und das war's, ein Deadlock)).
Ich weiß nicht einmal, wonach ich suchen soll, um zu studieren.

 
Roman:

Ja, ich kann die DLL selbst schreiben, mit einem leeren Einstiegspunkt ))
Aber die Informationen über den Einstiegspunkt sind nirgends zu finden, weder bei google noch in ähnlicher Literatur ((
Ich habe genau ein Problem mit dem Einstiegspunkt, wie Sie schreiben Interaktion Funktionen, Initialisierung, Speicherzuweisung, Threads, Deinitialisierung, etc.
Ich weiß, dass all dies in einem Schalter am Einstiegspunkt implementiert ist, und das war's, ein Deadlock)).
Ich weiß nicht einmal, wonach ich suchen soll, um zu studieren.

Glauben Sie, dass ich etwas über den Einstiegspunkt weiß? Das ist nicht die Sache des Königs). Es gibt nur eine einzige Funktion in der DLL, die sie definiert

// dllmain.cpp: определяет точку входа для приложения DLL.
#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                                         )
{
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
                break;
        }
        return TRUE;
}

Man muss es nicht verstehen). In Zukunft ist es in den meisten Fällen nicht mehr nötig, dies beim Schreiben und Betreiben der DLL zu verwenden. Das Wichtigste ist, dass Sie es nicht mit den Händen berühren).

 
Yuriy Asaulenko:

Glauben Sie, dass ich etwas über den Einstiegspunkt weiß? Das ist nicht die Sache des Königs). Es gibt nur eine einzige Funktion in der DLL, die sie definiert

Man muss es nicht verstehen). In Zukunft ist es in den meisten Fällen nicht mehr nötig, dies beim Schreiben und Betreiben der DLL zu verwenden. Das Wichtigste ist, dass man sie nicht mit den Händen berührt).

Nein, du musst es verstehen, du hast deine eigene Abfolge von Aktionen geschrieben, also dachte ich, du kennst sie gut.
An diesem Eingangspunkt werden alle Aktionen,Funktionsinitialisierung,Speicherzuweisung, Thread-Erstellung, Deinitialisierung usw. durchgeführt.
Was kann man wenigstens zu diesem Thema lesen?

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Asynchrone und Multithreading-Programmierung in MQL

Yuriy Asaulenko, 2019.07.27 21:25

Sie erstellen einen Thread in der DLL und übergeben ihm die Daten, trennen den Thread und vergessen ihn - er beendet sich selbst, nachdem er seine Aufgabe beendet hat.
Wenn Sie den Thread in der DLL abschalten, wird der Terminal-Thread freigegeben. Der gesamte Vorgang dauert, glaube ich, weniger als eine Millisekunde.
Nach der Tatsache zu urteilen, dass der Prozess des Schreibens in die Datenbank auch ohne Unterbrechung des Threads 4-5 ms dauert. Nun, 60 Ticks/s sind genug, um über den asynchronen Aufruf vom Terminal aus nicht traurig zu sein.


 
Roman:

Nein, du musst es verstehen, du hast die Sequenz selbst geschrieben, also dachte ich, du würdest sie gut kennen.
Was sollte man zumindest zu diesem Thema lesen?

Es ist nicht nötig, sie zu verstehen, sie zu ändern usw. Sie erstellen ein DLL-Projekt in VS, DllMain() wird von selbst erstellt. Alle Windows-Anwendungen unterstützen es automatisch.

Ihre Aufgabe ist es, Exportfunktionen zu schreiben und daneben jeglichen C++-Code, den Sie benötigen. Ihre DLL ist fertig und wird funktionieren.

OOP ist in erster Linie dazu gedacht, Objekte anzuwenden, ohne eine Ahnung von ihrem Innenleben zu haben, so dass Sie sich auf die Lösung Ihrer Aufgabe konzentrieren können, anstatt alles und jedes zu lernen. Wir fahren ein Auto und haben vielleicht keine Ahnung von der Elektronik und der Konstruktion des Motors. Das Gleiche gilt für die DLL.

Und die Funktion DllMain(), die ich vorhin zitiert habe, stammt aus einem echten Projekt einer ziemlich komplexen DLL, die ihre Aufgaben erfüllt.

 
Yuriy Asaulenko:

Es ist nicht nötig, sie zu verstehen, sie zu ändern usw. Sie erstellen ein DLL-Projekt in VS, DllMain() wird von selbst erstellt. Alle Windows-Anwendungen unterstützen es automatisch.

Ihre Aufgabe ist es, Exportfunktionen zu schreiben und daneben jeden C++-Code, den Sie benötigen. Ihre DLL ist fertig und wird funktionieren.

OOP ist in erster Linie dazu gedacht, Objekte anzuwenden, ohne eine Ahnung von ihrem Innenleben zu haben. Wir fahren ein Auto und haben vielleicht keine Ahnung von der Elektronik und der Konstruktion des Motors. Im Falle der DLL ist es dasselbe.

Das ist verständlich, die Funktionen selbst sind kein Problem, mit allen Konventionen wie in Artikel 1 und 2 gibt es kein Problem damit.
Aber wie ich annehme, um einen Thread fürdie aufgerufene Funktion zu erstellen,
im Fall von DLL_THREAD_ATTACH müssen wir ein wenig mit C++ herumfummeln
Speicher zuweisen, einen Thread für die Funktion erstellen,
und dann alles in DLL_THREAD_DETACH aufräumen, es ist also nicht so einfach, wie es aussieht.

Warum ich das sage, weil ich eine asynchrone Bibliothek ausprobiert habe, in der Aufgaben asynchron ausgeführt werden,
Ich wollte eine DLL aus dieser Bibliothek erstellen, aber aus irgendeinem Grund stürzt sie immer am Ende des Programms ab, d.h. beim Löschen des Expert Advisors aus dem Diagramm.
Aus diesem Grund ist es notwendig, den Ein- und Ausstiegspunkt zu verändern.

 
Roman:

Deshalb müssen Sie mit dem Ein- und Ausstiegspunkt herumspielen.

...d.h. wenn ich den EA aus dem Chart entferne, stürzt mein Terminal ab.

Das müssen Sie nicht. Es ist nicht der Einstiegspunkt, der die Schuld trägt. Sie machen etwas falsch.

Klassen, Fäden, etc. etc. - all dies ist perfekt erstellt und funktioniert gut in der DLL ohne Schamanismus. Wenn Sie jedoch das Programm beenden, müssen alle IHREN Prozesse in der DLL beendet und die Objekte zerstört werden. Bei der Fehlersuche in der DLL passiert dies). In C/C++ ist die gesamte Kontrolle Aufgabe des Programmierers, nicht des Programms.

ZS Ich mache das so. Ich rufe eine DLL-Funktion aus einer Anwendung auf, zum Beispiel

bool job =true;

void Close() 
{
	 job = false;
	 delete Obj1;
	 delete Obj2;
	......
}
Mit job=false werden alle Prozesse beendet, mit delete werden alle Objekte gelöscht, für die Speicher reserviert wurde, usw.
 
Yuriy Asaulenko:

Aber wenn Sie gehen, müssen alle IHREN Prozesse in der DLL abgeschlossen sein.

Das ist wahrscheinlich das Problem, das wusste ich nicht, ich dachte, dass die DLL ihre eigenen Prozesse abschließt, wenn sie die Verbindung aufhebt.
Ich werde darüber nachdenken, wie man alle Prozesse vor dem Beenden beendet, danke für den Tipp.
Aber nurDLL_PROCESS_DETACH ist dafür verantwortlich, und wir müssen in diesem Fall alle Prozesse zwangsweise beenden.

 
Roman:

Abergenau dafür ist DLL_PROCESS_DETACH zuständig, und alle Prozesse müssen in diesem Fall zwangsweise beendet werden.

Sie ist für die Entkopplung der DLL von der Anwendung verantwortlich. DllMain() ist für die Aufrechterhaltung des Standard-Kommunikationsprotokolls zuständig.DLL_PROCESS_DETACH hat mit anderen Dingen zu tun.) Ihre Prozesse interessieren sich nicht dafür, es ist allein Ihre Sache.

In MT gibt es eine Abschaltfunktion. Ich denke, es ist OnClose(). Hier werden alle Prozesse gestartet und durch Aufruf der entsprechenden DLL-Funktion beendet.

 
Yuriy Asaulenko:

Sie ist dafür zuständig, die DLL von der Anwendung zu trennen. Es interessiert sich nicht für Ihre Prozesse, das liegt ganz bei Ihnen.

OK, ich werde es ausprobieren. Vielen Dank, dass Sie sich die Zeit genommen haben, die Feinheiten zu erklären, vielen Dank.

Grund der Beschwerde: