Programmation asynchrone et multithread dans MQL - page 14

 
Реter Konow:

Est-ce vraiment si dangereux ? Erreurs dans la libération de la mémoire...

L'exemple concerne les principes généraux de la capture du contexte du dispositif et des ressources allouées dans Windows. Lors de la programmation de threads indépendants, le développeur doit s'assurer que le contexte du dispositif et les ressources sont libérés lorsque le système d'exploitation le demande, si le développeur utilise des commandes de bas niveau, il doit libérer lui-même toutes les ressources utilisées... Revenons au point que j'ai écrit - écrivez une fois en utilisant l'information googlée "Hello World"https://www.mql5.com/ru/forum/318593/page5#comment_12572558 et vous comprendrez beaucoup de choses, vous comprendrez que 99% du travail pour vous a été fait par les programmeurs système.

C'est-à-dire travailler dans un environnement MQL - les programmeurs de Metakvot l'ont fait pour vous - ils se sont assurés que le terminal fonctionnera au cas où le programme MQL ne fonctionnerait pas correctement.

 
Andrey Pogoreltsev:

Multithreading - les tâches sont exécutées dans plusieurs threads. Peut fonctionner sur un seul processeur, tout en étant multithreading et en passant de l'un à l'autre lorsque les quotas de temps processeur sont épuisés. Nécessite une synchronisation pour l'accès aux ressources partagées. Peut conduire à des blocages, des conditions de course, des bogues de libération de la mémoire et d'autres "surprises".

Asynchrone - exécution de fonctions non bloquées (c'est-à-dire que le contrôle est retourné immédiatement après la sortie de la méthode), généralement sur d'autres dispositifs (équipements de réseau, dispositifs de stockage, périphériques, etc. Par exemple, il est possible d'écrire un serveur multi-utilisateurs très performant en utilisant un seul thread et des connexions client de traitement en bout de chaîne. Tout dépend de l'objectif de ce serveur.

Dans votre cas, vous devez créer un grand nombre de connexions à l'aide de WinAPI et vous pouvez vérifier l'état de ces connexions avec WaitForMultipleObjects avec un délai d'attente, de sorte que vous n'avez pas besoin de maintenir un thread de minuterie, par exemple.

PS : en théorie, vous pouvez également utiliser l'IOCompletionPort, mais cela demande plus de connaissances et une conception soignée.

Eh bien... vous vous êtes trouvés.

 
Peut-être que les gens n'ont pas assez de vitamines ou de micronutriments...
 
Roman:

Merci pour cette réponse informative ;))
Allez-y et expliquez ce qui est là et où.
Et comment écrire du code asynchrone avecEventloop par des moyens standards ?

Tout est dans la documentation.

Vous pouvez commencer par le lire et essayer d'écrire quelque chose.

Et si vous ne pouvez pas, vous pouvez demander sur le forum.

Pour l'instant, on ne parle de rien.


 
Koldun Zloy:

Tout est dans la documentation.

Vous pouvez commencer par le lire et essayer d'écrire quelque chose.

Et si vous ne pouvez pas, vous pouvez demander sur le forum.

Pour l'instant, on ne parle de rien.


À votre avis, pourquoi ce sujet a-t-il été créé ?
Vous nous dites comment écrire du code asynchrone de la manière habituelle, et vous le montrez dans la documentation.
Outre l'envoi de requêtes asynchrones, montrez où se trouvent les fonctions de rappel, où le contrôle des boucles d'événements, où l'attente, etc.
Je suis sûr que vous ne pourrez pas répondre à cette question, car il n'existe pas de fonctionnalité de ce type pour les utilisateurs, et elle ne figure pas dans la documentation.
Exactement, la conversation ne porte sur rien, la seule personne présente dans ce fil de discussion estAndrey Pogoreltsev, qui comprend le sujet de la communication.

 
Euentloop ! Est-ce que quelqu'un a un Euentloop ? Un homme n'est pas bien ici sans un Euentloop ! Que quelqu'un me donne un Euentloop !
 

Romain, 2019.07.27 09:30

À votre avis, pourquoi ce sujet a-t-il été créé ?


Vous avez posé une question sur le multithreading. Il n'y en a pas.

Mais ce n'est pas non plus ce dont vous devez vous soucier pour l'instant.

Romain, 2019.07.27 09:30

Vous nous dites comment écrire du code asynchrone en utilisant les moyens standards et vous le montrez dans la documentation.
Outre l'envoi de requêtes asynchrones, montrez-nous où se trouvent les fonctions Callback, où le contrôle des EventLoop, où Wait, etc.
Je suis sûr que vous ne pouvez pas répondre à cette question parce qu'il n'existe pas de fonctionnalité de ce type pour les utilisateurs et qu'elle ne figure pas dans la documentation.
Exactement, la conversation ne porte sur rien, la seule personne présente dans ce fil de discussion est Andrey Pogoreltsev, qui comprend le sujet de la communication.

Je peux vous montrer tout ça. Mais quel est l'intérêt ?

Si vous en aviez besoin, vous le trouveriez vous-même.

Il est évident que vous n'avez pas lu la documentation ou les articles.
 
Koldun Zloy:

Vous avez posé une question sur le multithreading. Il n'y a pas de multithreading.

Le multi-threading est commehttps://www.mql5.com/ru/docs/runtime/running , c'est-à-dire que nous voulons paralléliser la tâche, ouvrir plusieurs graphes (malheureusement, je n'ai pas encore essayé d'utiliser les fonctions de services - peut-être que ce sera encore plus facile avec eux ? ) et y attacher nos EA travaillant dans des threads séparés, puis résoudre le problème de la synchronisation et de l'échange de données (tâches).

J'ai demandé cinq fois au TS - pourquoi le terminal de trading en a besoin... il ne sait pas, parce qu'il n'y a pas de tâche ou de but précis.

Je le vois dans des applications client-serveur qui ne sont pas typiques du terminal de trading, peut-être est-il pratique pour quelqu'un d'envoyer des statistiques au serveur ? - Eh bien, j'ai déjà écrit un exemple (article) prêt à l'emploihttps://www.mql5.com/ru/articles/5337.

Les sources sont lisibles et l'article est d'excellente qualité ; les sources peuvent être modifiées pour effectuer des calculs parallèles dans plusieurs threads..... Maintenant, que devons-nous calculer ? )))

 
Igor Makanu:

L'exemple concerne les principes généraux de la capture du contexte du dispositif et des ressources allouées dans Windows. Lors de la programmation de threads indépendants, le développeur doit s'assurer de libérer le contexte du dispositif et les ressources lorsque le système d'exploitation le demande, si le développeur utilise des commandes de bas niveau, il doit libérer lui-même toutes les ressources utilisées... Revenons au point que j'ai écrit - écrivez une fois en utilisant l'information googlée "Hello World" https://www.mql5.com/ru/forum/318593/page5#comment_12572558 et vous comprendrez beaucoup de choses, vous comprendrez que 99% du travail pour vous a été fait par les programmeurs système.

En d'autres termes, en travaillant dans l'environnement MQL, les programmeurs de Metakvot l'ont fait pour vous - ils ont assuré le fonctionnement stable du terminal avec un travail inadéquat des programmes MQL.

OK, pas d'arguments, convaincu. Il n'est pas toujours possible pour les codeurs autodidactes d'obtenir les bons fils par eux-mêmes, ce qui peut entraîner des erreurs critiques. "Les allumettes ne sont pas des jouets pour les enfants". Cependant, nous avons besoin d'un moyen de réaliser le multithreading dans un seul programme.

La logique est simple : le lancement séquentiel des services ne provoque pas d'erreurs, et chaque service s'exécute dans son propre thread. Le mécanisme est donc déjà configuré et débogué. Bien. Nous devons faire un pas en avant : écrire ces services dans le code de l'Expert Advisor dans des modules spéciaux. Chaque module sera le même service. Ensuite, nous devons compiler séquentiellement ces modules et les exécuter simultanément. C'est tout.

En fait, rien ne change. Seuls les services seront écrits dans le code du hibou. Ils se compileraient et fonctionneraient de la même manière. Ils seront supprimés lorsque l'EA sera retiré du graphique. De cette façon, nous obtenons une EA multithread.

 
Vous pouvez faire encore plus simple. Le conseiller expert charge lui-même les services requis, qui sont écrits séparément. Lorsqu'il est retiré du tableau, il les arrête. La seule chose à faire est d'ajouter le début des services à partir du conseiller expert. Et l'interaction interne entre les threads est une tâche du programmeur. Elle est résolue à l'aide de ressources.
Raison: