Programmation asynchrone et multithread dans MQL - page 2

 
Koldun Zloy:

Je vais traduire ce qui vous a déjà été dit par un représentant de la société de développement MT :

Vous ne pouvez pas créer de fils à partir de MQL. Pas même avec WinAPI.

Vous ne pouvez le faire qu'en écrivant votre propre DLL.

WinAPI et utilise la dll standard !

kernel32.dll
user32.dll

etc.

Le travail multithreading est prévu avec les fonctions WinAPI, pas avec les fonctions mql.
Mais il est regrettable que vous ne puissiez pas travailler en multithread avec les fonctions mql.

 
Roman:

WinAPI et utilise des dlls standard !

kernel32.dll
user32.dll

Hmm, c'est exactement le contraire, WinAPI est implémenté sous forme de bibliothèques dynamiques kernel32.dll , user32.dll...

Vous n'avez jamais essayé d'écrire en C++ pur une fenêtre Windows habituelle avec le texte "Hello Word !". - Il y a des exemples sur le net, écrivez votre premier "Hello Word ! - ça va s'arranger tout seul ;)

 
Igor Makanu:

hmm, exactement le contraire : WinAPI est implémenté sous forme de bibliothèques dynamiques kernel32.dll , user32.dll...

Vous n'avez jamais essayé d'écrire en C++ pur une fenêtre Windows habituelle avec le texte "Hello Word !". - Il y a des exemples sur le net, écrivez votre premier "Hello Word ! - beaucoup de choses s'éclairciront d'elles-mêmes ;)


Standard signifie dlls standard de Windows, standard ne signifie pas qu'il s'agit de .lib statiques.

Igor, tu vas dans la mauvaise direction...
Qu'est-ce que "Hello Word !" a à voir avec l'initialisation de la dll, et appeler des fonctions à partir de celle-ci dans votre thread !

Par exemple :
Il existe la fonction WinAPI MessageBoxW() ;
Il doit être appelé dans son propre fil.

Pour cela, vous devez initialiser la dll elle-même et la fonction exportée. Pouvez-vous donner un exemple de la manière de procéder correctement ?

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

Puis, après l'initialisation, appelez MessageBoxW() ; avec CreateThread() ;
Après l'exécution de la fonction, libérez la ressource et fermez le fil.
Donnez-moi un exemple de la façon de le faire correctement en mql ?

 
Je travaille actuellement sur un système multithread. Mais pas en MCL, mais en C++ standard. Ah, combien de râteaux il y a.)
 
Roman:


Standard signifie la dll standard de Windows, standard ne signifie pas qu'il s'agit de .lib statiques.

Igor, vous allez dans la mauvaise direction...
Qu'est-ce que "Hello Word !" a à voir avec l'initialisation de la dll, et appeler des fonctions à partir de celle-ci dans votre thread !

Par exemple :
Il existe la fonction WinAPI MessageBoxW() ;
Il doit être appelé dans son propre fil.

Pour cela, vous devez initialiser la dll elle-même et la fonction exportée. Pouvez-vous donner un exemple de la manière de procéder correctement ?

Puis, après l'initialisation, appelez MessageBoxW() ; avec CreateThread() ;
Après l'exécution de la fonction, libérez la ressource et fermez le fil.
Donnez-moi un exemple de la façon de le faire correctement en mql ?

Vous êtes sur la mauvaise voie, on vous a dit : écrivez une dll (dans laquelle vous devez allouer de la mémoire et enregistrer un nouveau thread ! - puis détruisez soigneusement tout à la sortie !) et appelez-le depuis MQL

où en sont l'allocation de mémoire et l'enregistrement du processus dans votre exemple ? L'appel à MessageBox - cela signifie que le programme MQL a alloué ses ressources mais n'a pas créé de thread séparé. Je ne veux même pas le vérifier, mais lorsque vous appelez MessageBox, le terminal devrait se figer

 
Igor Makanu:

Vous allez dans la mauvaise direction, je vous l'ai dit - écrivez une dll et appelez-la depuis MQL.

où, dans votre exemple, se trouvent l'allocation de mémoire et l'enregistrement des processus ? le fait que vous ayez appelé MessageBox - cela signifie seulement que le programme MQL a fourni ses ressources mais n'a pas créé un thread séparé. je ne veux même pas le vérifier, mais lorsque vous appelez MessageBox, votre terminal devrait se figer

Igor, j'ai cité les fonctions de la dll d'initialisation comme exemple pour comprendre ce dont je parle. Mais je ne sais pas comment le faire correctement en mql, le C++ pur peut être trompeur.
La particularité de mql elle-même peut prêter à confusion. C'est pourquoi j'ai demandé de l'aide sur le forum, pas sur Google.
Pourquoi ai-je besoin d'écrire une dll, quand WinAPI est construit sur la dll, et les fonctions appelables sont déjà dansuser32.dll, par exemple
? J'ai créé le sujet pour comprendre la question comment le faire correctement dans mql, et vous me dire où allouer la mémoire et enregistrer le processus.
Montrez-moi un exemple concret de comment le faire en mql ?
Ou me diriger vers un bon guide.

 
Roman:

Igor, j'ai donné les fonctions d'initialisation de la dll comme exemple pour comprendre ce que je veux dire, mais je ne sais pas comment le faire correctement en mql, le C++ pur peut être trompeur.
La particularité de mql elle-même peut prêter à confusion. C'est pourquoi j'ai demandé de l'aide sur le forum, pas sur Google.
Pourquoi ai-je besoin d'écrire une dll, lorsque WinAPI est construit sur la dll, et les fonctions appelables sont déjà dans user32.dll, par exemple
? J'ai créé le sujet pour comprendre la question, comment le faire correctement dans mql, et vous me dire où l'allocation de mémoire et l'enregistrement du processus est)).
Montrez-moi un exemple concret de comment le faire en mql ?
Ou me diriger vers un bon guide.

Vous ne pouvez pas créer un thread à partir du programme mql, même en utilisant WinAPI.

 
Roman:

Igor, j'ai donné un exemple de fonctions d'initialisation de dll pour comprendre ce que je veux dire, mais comment le faire correctement en mql, je ne le sais pas, le C++ pur peut être trompeur.
La particularité de mql elle-même peut prêter à confusion. C'est pourquoi j'ai demandé de l'aide sur le forum, pas sur Google.
Pourquoi ai-je besoin d'écrire une dll, lorsque WinAPI est construit sur la dll, et les fonctions appelables sont déjà dans user32.dll, par exemple
? J'ai créé le sujet pour comprendre la question, comment le faire correctement dans mql, et vous me dire où l'allocation de mémoire et l'enregistrement du processus est)).
Montrez-moi un exemple concret de comment le faire en mql ?
Ou me diriger vers un bon guide.

Encore une fois, cela ne se fait pas au moyen de MQL, vous résolvez le problème de l'autre côté - du côté de la queue, pas de la tête !

Vous écrivez une dll - l'appelez depuis MQL et passez les données à la dll, et si vous avez besoin de continuer le programme MQL (calculs complexes), vous créez un nouveau thread dans la dll et traitez les données dans ce thread.

Vous pouvez lire comment écrire un dll - recherchez "dll" dans le forum et vous trouverez environ 20 articles.

Il n'y a pas de didacticiels, mais la ressource que vous utiliserez pour écrire une dll, donc cherchez des solutions sur la façon de créer des fils et ainsi de suite.

 
Dmitry Fedoseev:

Vous ne pouvez pas créer un flux à partir d'un programme mql, même en utilisant WinAPI.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Programmation asynchrone et multithread dans MQL

MetaQuotes Software Corp., 2019.07.24 16:31

Vous ne pouvez pas appeler les fonctions MQL à partir d'une DLL.

Mais il est possible d'exécuter plusieurs threads via des appels DLL afin qu'ils fonctionnent indépendamment de MQL5 dans leur environnement.

Par exemple, vous préparez des données à partir de MQL, les placez quelque part ou les transmettez à la DLL qui, à son tour, exécutera la tâche dans plusieurs threads et renverra le résultat par une fonction supplémentaire.


L'appel de fonctions de l'API Windows est un appel de dll, cela signifie que les threads peuvent être créés pour les fonctions de l'API Windows en utilisantCreateThread() ;
Ce n'est pas pour rien
que CreateThread() ; a été porté à la bibliothèque standard mql.

 
Roman:

L'appel des fonctions de l'API Windows est un appel de la dll, donc pour les fonctions de l'API Windows il est possible de créer des threads en utilisantCreateThread() ;
CreateThread() ; a été porté à la bibliothèque standard mql pour une raison.

personne n'a porté quoi que ce soit, ce que vous voyez dans le paquet sont juste des signatures de fonctions.

pour créer un flux, il faut un corps de fonction - c'est le corps qui va fonctionner dans le flux !

Pour enregistrer un fil dans Windows, vous devez remplir la structure :

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

voirlpStartAddress - il s'agit de l'adresse du point d'entrée de la fonction qui sera exécutée dans le thread, ne vous préoccupez pas de l'allocation de mémoire.

pour résoudre ce problème, vous devez trouver une occasion d'obtenir l'adresse de MyFunc() - en mémoire, et elle est absente - eh bien, nulle part du tout ... Aucun !


Je ne sais pas comment expliquer autrement le problème... qui n'existe pas vraiment ))))