Asynchrone und mehrfädige Programmierung in MQL - Seite 2

 
Koldun Zloy:

Ich werde übersetzen, was Ihnen bereits von einem Vertreter der MT-Entwicklungsgesellschaft mitgeteilt wurde:

Sie können keine Threads von MQL aus erstellen. Nicht einmal mit WinAPI.

Sie können dies nur tun, indem Sie Ihre eigene DLL schreiben.

WinAPI und verwendet Standard-DLL !

kernel32.dll
user32.dll

usw.

Multithreading ist mit WinAPI-Funktionen vorgesehen, nicht mit mql-Funktionen.
Aber es ist bedauerlich, dass man mit mql-Funktionen nicht in mehreren Threads arbeiten kann.

 
Roman:

WinAPI und verwendet Standard-DLLs !

kernel32.dll
user32.dll

Hmm, genau das Gegenteil, WinAPI ist als dynamische Bibliotheken kernel32.dll , user32.dll... implementiert.

Sie haben noch nie versucht, in reinem C++ ein gewöhnliches Windows-Fenster mit dem Text "Hello Word!" zu schreiben. - Es gibt Beispiele im Netz, schreiben Sie Ihr erstes "Hello Word! - es wird sich von selbst aufklären ;)

 
Igor Makanu:

hmm, genau das Gegenteil: WinAPI ist als dynamische Bibliotheken kernel32.dll , user32.dll... implementiert.

Sie haben noch nie versucht, in reinem C++ ein gewöhnliches Windows-Fenster mit dem Text "Hello Word!" zu schreiben. - Es gibt Beispiele im Netz, schreiben Sie Ihr erstes "Hello Word! - Vieles klärt sich dann von selbst ;)


Standard bedeutet Standard-Windows-DLLs, Standard bedeutet nicht, dass es sich um statische .lib

Igor, du gehst in die falsche Richtung...
Was hat "Hello Word!" mit der Initialisierung der Dll zu tun, und rufen Sie Funktionen davon in Ihrem Thread auf!

Zum Beispiel:
Es gibt die WinAPI-Funktion MessageBoxW();
Sie muss in ihrem eigenen Thread aufgerufen werden.

Dazu müssen Sie die DLL selbst und die exportierte Funktion initialisieren. Können Sie ein Beispiel geben, wie man das richtig macht?

LoadLibraryW("user32.dll");
GetProccAddress(hMyDll, "MessageBoxW");
FreeLibrary(hMyDll);
и т.д.

Rufen Sie dann nach der Initialisierung MessageBoxW(); mit CreateThread() auf;
Nachdem die Funktion ausgeführt wurde, geben Sie die Ressource frei und schließen den Thread.
Geben Sie mir ein Beispiel dafür, wie man es in mql richtig macht?

 
Ich arbeite derzeit an einem Multithreading-System. Aber nicht in MCL, sondern in Standard-C++. Ach, wie viele Harken es doch gibt.)
 
Roman:


Standard bedeutet die Standard-Windows-DLL, Standard bedeutet nicht, dass es sich um statische .lib

Igor, du gehst in die falsche Richtung...
Was hat "Hello Word!" mit der Initialisierung der dll zu tun, und rufen Sie Funktionen davon in Ihrem Thread auf!

Zum Beispiel:
Es gibt die WinAPI-Funktion MessageBoxW();
Sie muss in ihrem eigenen Thread aufgerufen werden.

Dazu müssen Sie die DLL selbst und die exportierte Funktion initialisieren. Können Sie ein Beispiel geben, wie man das richtig macht?

Rufen Sie dann nach der Initialisierung MessageBoxW(); mit CreateThread() auf;
Nach Ausführung der Funktion wird die Ressource freigegeben und der Thread geschlossen.
Geben Sie mir ein Beispiel dafür, wie man es in mql richtig macht?

Sie sind auf dem falschen Weg, wurde Ihnen gesagt - schreiben Sie eine DLL (in der Sie Speicher zuweisen und einen neuen Thread registrieren müssen! - dann alles beim Verlassen sorgfältig zerstören!) und es von MQL aus aufrufen

wo Speicherzuweisung und Prozessregistrierung in Ihrem Beispiel sind? Der MessageBox-Aufruf bedeutet, dass das MQL-Programm seine Ressourcen zugewiesen hat, aber keinen separaten Thread erstellt hat. Ich möchte es nicht einmal überprüfen, aber das Terminal sollte einfrieren, wenn MessageBox aufgerufen wird

 
Igor Makanu:

Sie gehen den falschen Weg, sagte ich Ihnen - schreiben Sie eine DLL und rufen Sie es von MQL

wo in Ihrem Beispiel ist Speicherzuweisung und Prozessregistrierung? die Tatsache, dass Sie MessageBox aufgerufen haben - dies bedeutet nur, dass das MQL-Programm seine Ressourcen zur Verfügung gestellt hat, aber nicht einen separaten Thread erstellt hat. Ich will es nicht einmal überprüfen, aber wenn Sie MessageBox aufrufen, sollte Ihr Terminal einfrieren

Igor, ich habe die Funktionen der Initialisierungs-DLL als Beispiel angeführt, um zu verstehen, wovon ich spreche. Aber ich weiß nicht, wie man es in mql richtig macht, reines C++ kann irreführend sein.
Die Besonderheit von mql selbst kann Verwirrung stiften. Deshalb habe ich im Forum um Hilfe gebeten, nicht bei Google.
Warum muss ich eine dll schreiben, wenn WinAPI auf dll aufgebaut ist, und aufrufbare Funktionen sind bereits inuser32.dll, zum Beispiel
? Ich habe das Thema erstellt, um die Frage zu verstehen, wie es richtig in mql zu tun, und Sie sagen mir, wo Speicherzuweisung und Prozessregistrierung ist)).
Zeigen Sie mir ein gutes Beispiel, wie man das in mql macht?
Oder verweisen Sie mich auf einen guten Leitfaden.

 
Roman:

Igor, ich gab die DLL-Initialisierungsfunktionen als Beispiel, um zu verstehen, was ich meine, aber ich weiß nicht, wie man es richtig in mql tun, reine C++ kann irreführend sein.
Die Besonderheit von mql selbst kann Verwirrung stiften. Deshalb habe ich im Forum um Hilfe gebeten, nicht bei Google.
Warum muss ich eine dll schreiben, wenn WinAPI auf dll aufgebaut ist, und aufrufbare Funktionen sind bereits in user32.dll, zum Beispiel
? Ich habe das Thema erstellt, um die Frage zu verstehen, wie es richtig in mql zu tun, und Sie sagen mir, wo Speicherzuweisung und Prozessregistrierung ist)).
Zeigen Sie mir ein gutes Beispiel, wie man das in mql macht?
Oder verweisen Sie mich auf einen guten Leitfaden.

Sie können keinen Thread aus dem mql-Programm erstellen, auch nicht mit WinAPI.

 
Roman:

Igor, gab ich ein Beispiel für DLL-Initialisierungsfunktionen zu verstehen, was ich meine, aber wie man es richtig in mql tun, ich bin nicht bewusst, reine C++ kann irreführend sein.
Die Besonderheit von mql selbst kann Verwirrung stiften. Deshalb habe ich im Forum um Hilfe gebeten, nicht bei Google.
Warum muss ich eine dll schreiben, wenn WinAPI auf dll aufgebaut ist, und aufrufbare Funktionen sind bereits in user32.dll, zum Beispiel
? Ich habe das Thema erstellt, um die Frage zu verstehen, wie es richtig in mql zu tun, und Sie sagen mir, wo Speicherzuweisung und Prozessregistrierung ist)).
Zeigen Sie mir ein gutes Beispiel, wie man das in mql macht?
Oder verweisen Sie mich auf einen guten Leitfaden.

Noch einmal, dies geschieht nicht mit Hilfe von MMS, Sie lösen das Problem von der anderen Seite - von der Schwanzseite, nicht von der Kopfseite!

Sie schreiben eine DLL - rufen sie von MQL aus auf und übergeben Daten an die DLL, und wenn Sie das MQL-Programm fortsetzen müssen (komplexe Berechnungen), erstellen Sie einen neuen Thread in der DLL und verarbeiten die Daten in diesem Thread

Sie können lesen, wie man eine dll schreibt - suchen Sie im Forum nach "dll" und Sie werden etwa 20 Artikel finden

Es gibt keine Tutorials, aber die Ressource, die Sie verwenden, um eine DLL zu schreiben, so suchen Sie nach Lösungen, wie man Threads und so weiter zu erstellen.

 
Dmitry Fedoseev:

Sie können keinen Fluss aus einem mql-Programm erstellen, auch nicht mit WinAPI.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Asynchrone und Multithreading-Programmierung in MQL

MetaQuotes Software Corp., 2019.07.24 16:31

Sie können MQL-Funktionen nicht von einer DLL aus aufrufen.

Es ist jedoch möglich, mehrere Threads über DLL-Aufrufe laufen zu lassen, so dass sie unabhängig von MQL5 in ihrer Umgebung arbeiten.

So bereiten Sie beispielsweise Daten aus MQL vor, legen sie irgendwo ab oder übergeben sie an eine DLL, die ihrerseits die Aufgabe in mehreren Threads ausführt und das Ergebnis über eine zusätzliche Funktion zurückgibt.


DerAufruf von Windows-API-Funktionen ist ein Aufruf von dll, das heißt, dass Threads für Windows-API-Funktionen mitCreateThread();
erstellt werden können.Nicht um sonst wurdeCreateThread(); in die Standard-Mql-Bibliothek portiert.

 
Roman:

DerAufruf von Windows-API-Funktionen ist ein Aufruf von dll, so dass es für Windows-API-Funktionen möglich ist, Threads mitCreateThread()zu erstellen;
CreateThread(); wurde nicht ohne Grund in die Standard-Mql-Bibliothek portiert.

niemand hat irgendetwas portiert, was Sie in dem Paket sehen, sind nur Funktionssignaturen.

Um einen Fluss zu erstellen, benötigen Sie einen Funktionskörper - das ist der Körper, der im Fluss ausgeführt wird!

Um einen Thread in Windows zu registrieren, müssen Sie die Struktur ausfüllen:

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES   lpThreadAttributes,
  SIZE_T                  dwStackSize,
  LPTHREAD_START_ROUTINE  lpStartAddress,
  __drv_aliasesMem LPVOID lpParameter,
  DWORD                   dwCreationFlags,
  LPDWORD                 lpThreadId
);

siehelpStartAddress - dies ist die Adresse des Einstiegspunkts der Funktion, die in dem Thread ausgeführt wird, keine Sorge um dieSpeicherzuweisung

um dieses Problem zu lösen, müssen Sie eine Möglichkeit finden, die Adresse von MyFunc() zu erhalten - im Speicher, und es ist nicht vorhanden - nun, nirgendwo auf allen ... keine!


Ich weiß nicht, wie ich das Problem sonst erklären soll ... die es in Wirklichkeit nicht gibt ))))