Asynchrone und mehrfädige Programmierung in MQL - Seite 3

 
Vict:

Etwas, das wir nicht verstehen.

Aber verzetteln Sie sich nicht - Sie werden keinen Thread über CriAtTrade() innerhalb von µl erstellen, Sie müssen einen Zeiger auf eine Funktion übergeben (wo der Thread starten wird), aber wie oben erwähnt - kukush.

Erstellen Sie Ihre eigene DLL, die die richtige Anzahl von Threads selbst erzeugt.

Wenn Sie komplexe Berechnungen durchführen wollen, dann reichen reine WinAPI-Aufrufe nicht aus.

Ja, wir haben viele WinAPI-Aufrufprototypen selbst entwickelt, aber das bedeutet nicht, dass alle von ihnen sauber von MQL aufgerufen werden können.

 
Igor Makanu:

niemand hat irgendetwas portiert, was Sie in der Endunit sehen, sind nur Funktionssignaturen

um einen Thread zu erstellen, benötigen Sie den Körper der Funktion - das ist der Körper, der im Thread ausgeführt wird!

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

siehelpStartAddress - dies ist die Adresse des Einstiegspunkts der Funktion, die im Thread ausgeführt wird, keine Sorge um die Speicherzuweisung

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 - na ja, nirgendwo auf allen ... keine!


Ich weiß nicht, wie ich das Problem sonst erklären soll ... was nicht die Essenz ist ))))

Hier ist eine portierte Funktion in einem Programm mit Parametern, was ist der Unterschied?

HANDLE  CreateThread(PVOID thread_attributes, 
                     ulong stack_size, 
                     PVOID start_address, 
                     PVOID parameter, 
                     uint creation_flags, 
                     uint &thread_id);

Und hier ist die portierte Funktion, die die Adresse der Funktion erhält

PVOID  GetProcAddress(HANDLE module,
                      uchar &proc_name[]);
 

Tatsächlich können Sie CreateThread nicht vollständig von MQL aus aufrufen, da die physischen Adressen der Funktionen nicht verfügbar sind.

Sie müssen Ihre eigene DLL erstellen, die echte Handler bereitstellt.

 
MetaQuotes Software Corp.:

Tatsächlich können Sie CreateThread nicht vollständig von MQL aus aufrufen, da die physischen Adressen der Funktionen nicht verfügbar sind.

Sie müssen Ihre eigene DLL erstellen, die echte Handler bereitstellt.

Schade. Sie habenCreateThread(); undGetProcAddress();
portiert. Und man kann keine physischen Adressen von Funktionen erhalten, was ist der Trick? ))
Sicherheit ist eine gute Sache, aber, wie Sie sehen, schränkt sie die Verwendung der Standard-WinAPI ein.
Warum wurden diese Funktionen portiert und in die mql-Standardbibliothek aufgenommen?
Irreführung des Benutzers, wenn man sie nicht benutzen kann))
Und Sie schlagen vor, eine eigene asynchrone DLL zu schreiben, die ich loswerden wollte, indem ich die Standard-WinAPI
Aber ich schätze, ich werde wieder meine eigene asynchrone DLL schreiben müssen.

p.s.
Hier sind die Fallstricke von mql, für diejenigen, die gerne die ganze Zeit zu Google schicken, gibt es diese Informationen per Definition nicht.

 
Roman:

Schade. Sie habenCreateThread(); undGetProcAddress();
portiert. Und man kann die physikalischen Adressen von Funktionen nicht bekommen, was ist der Trick? ))
Sicherheit ist eine gute Sache, aber, wie Sie sehen, schränkt sie die Verwendung der Standard-WinAPI ein.
Warum wurden diese Funktionen portiert und in die mql-Standardbibliothek aufgenommen?
Irreführung des Benutzers, wenn man sie nicht benutzen kann))
Und Sie schlagen vor, eine eigene asynchrone DLL zu schreiben, die ich loswerden wollte, indem ich die Standard-WinAPI
Aber ich schätze, ich werde wieder meine eigene asynchrone DLL schreiben müssen.

p.s.
Hier sind die Fallstricke von mql, für diejenigen, die gerne die ganze Zeit zu Google schicken, gibt es diese Informationen per Definition nicht.

Verwechseln Sie nicht das Prototyping von WinAPi-Funktionen mit der Portierung von Funktionen.

Wir haben bewusst darauf geachtet, Prototypen von Standard-WinAPI-Funktionen bereitzustellen, damit Entwickler das Rad nicht neu erfinden müssen. Es handelt sich nicht um Bibliotheken, sondern um Beschreibungen.

Rohe WinAPI-Beschreibungen zu haben bedeutet nicht, dass wir eine Garantie/Gelegenheit für unsichere Aufrufe bieten.

Bei einer Anwendungssprache dieses Niveaus ist die Sicherheit von größter Bedeutung.

 
Hmmm... Dann tritt ein weiteres Problem auf.
Wie dann von mql zu normal initialisieren die dll geladen werden und die Funktionen exportiert werden?

LoadLibraryW("MyDll.dll");
GetProccAddress(hMyDll, "MyFunc");
 
Roman:
Hmm ... Dann tritt ein weiteres Problem auf.
Wie dann von mql normalerweise initialisieren die ladbare DLL, und exportierte Funktionen?

können Sie lesen? können Sie Suchmaschine verwenden? es gibt mehr als 20 Artikel über das Schreiben von DLLs auf dieser Ressource, einige Artikel sind aus erster Hand geschrieben - von Admins (Entwickler), lesen, tun, alles ist im freien Zugang, - es gibt keine detaillierteren Anweisungen, wie man eine DLL zu schreiben, ohne zu wissen, Programmiersprachen überhaupt, aber nur auf diese Ressource! - sogar mit Bildern!

was wollen Sie erreichen? - Verbot bei Überschwemmungen?

Roman:

Aber ich werde wohl wieder meine asynchrone DLL schreiben müssen.

was hindert sie am schreiben? brauchen sie fanfarenklänge? - jeder, der mit grundlegenden C++ oder noch einfacher in C# vertraut ist - während eines Tages ist in der Lage, diese Informationen zu finden, zu schreiben und zu überprüfen, in den Code, hier brauchen Sie nur "Lust und assiduousness" - so einer der Admins schrieb, imho, es ist unmöglich, den Ausdruck präziser zu wählen



SZS: Ich kann mich nicht an einen Fall erinnern, in dem ein Administrator innerhalb einer Stunde so viele Antworten an einen Benutzer geschrieben hätte, hat sich etwas geändert, oder stehen die Sterne so? )))))

 
Igor Makanu:

können Sie lesen? können Sie Suchmaschine verwenden? es gibt mehr als 20 Artikel über das Schreiben von DLLs auf dieser Ressource, einige Artikel sind aus erster Hand geschrieben - von Admins (Entwickler), lesen, tun, alles ist im freien Zugang, - es gibt keine detailliertere Anweisungen, wie man eine DLL zu schreiben, ohne zu wissen, Programmiersprachen überhaupt, aber nur auf dieser Ressource! - sogar mit Bildern!

was wollen Sie erreichen? - Verbot bei Überschwemmungen?

SZS: Ich kann mich nicht an einen Fall erinnern, in dem ein Administrator innerhalb einer Stunde so viele Antworten an einen Benutzer geschrieben hat. )))))

Es gibt keine Beschreibung in diesen Artikeln über die Initialisierung der DLL und der Funktionen !!!
Zeigen Sie mir, wo die Initialisierung der dll-Bibliothek und derexportierbaren Funktionen beschrieben ist, ich wäre Ihnen sehr dankbar.
Es gibt keinen Grund zu denken, dass die Leute keine Artikel lesen, bevor sie sich auf ein Forum beziehen!

Igor Makanu:

was hält sie vom schreiben ab? brauchen sie fanfaren? - Jeder, der C++ oder sogar einfacheres C# beherrscht, kann diese Informationen googeln, schreiben und in den Code einchecken, alles was man braucht, ist "Lust und ein fleißiger Arsch" - so schrieb einer der Admins, imho könnte der Ausdruck nicht präziser sein

Nichts verhindert! Die Aufgabe bestand darin, eine reine WinAPI zu verwenden. Ohne jede selbstgeschriebene dll!
Dieser Thread wurde erstellt, um das Problem der Multithreading-Programmierung in mql zu diskutieren, haben Sie eine Art von negativen Haltung heute, welche Art von Überschwemmung in das Thema von mir erstellt?
Bitte unterlassen Sie derartige Kommentare.

 
Roman:
Hm... Dann taucht ein weiteres Problem auf.
Wie dann von mql zu normal initialisieren die dll geladen werden und Funktionen exportiert werden?

Sie müssen diese Funktionen nicht in mql einbinden. Erstellen Sie dort Prozesse in der DLL.

 
Dmitry Fedoseev:

Sie müssen diese Funktionen nicht in mql einbinden. Erstellen Sie dort Prozesse in der dll.

Ihre dll, initialisieren Sie es inDLL_PROCESS_ATTACH: wird es genug sein, um von mql Programm aufrufen?
Dachte, es sei möglich, mit WinAPI-Funktionen ohne Probleme zu arbeiten, und geschlossene dll muss zusätzlich initialisiert werden,
LoadLibraryW("MyDll.dll");

Grund der Beschwerde: