Programmation asynchrone et multithread dans MQL - page 24

 
Roman:

Je n'ai pas fait d'études pour être programmeur, j'apprends tout par moi-même, alors ne me mettez pas au pied du mur ;))

Moi non plus. J'ai une autre profession. La programmation n'est qu'un outil, comme un marteau).

Création d'une DLL pour MKL - il s'agit d'une DLL absolument standard, sans particularités. Le reste est du pur C++, ou du pur C# si vous préférez.

Enseigner C++ ou Sharp me dépasse, mais il y a des wagons de littérature, à tous les niveaux.

Il y a un article sur MKL sur la création d'une DLL simple, mais je ne peux pas dire qu'il soit informatif. Oui, et Google pour aider avec la requête - création de DLL C++.

D'ailleurs, en parlant du point d'entrée et ainsi de suite. Dans Visual Studio, vous créez un projet DLL et tout ce dont vous avez besoin est créé par vous-même, il suffit de ne pas y toucher de vos mains). Et les fonctions d'interaction, les fils de discussion, etc. sont à votre choix. - dépendent de vous. Il s'agit de C++, aucune caractéristique de ce type n'est associée spécifiquement à la DLL.

ZZY La meilleure façon d'apprendre quelque chose est de résoudre une tâche spécifique. Ce n'est même pas moi qui l'ai inventé).

 
Yuriy Asaulenko:

Moi non plus. J'ai une autre profession. La programmation n'est qu'un outil, comme un marteau).

Création de dlls pour MKL - dlls absolument standard, sans particularités. Le reste est du pur C++, ou du pur C# si vous préférez.

Enseigner C++ ou Sharp me dépasse, mais il y a des wagons de littérature, à tous les niveaux.

Il y a un article sur MKL sur la création d'une DLL simple, mais je ne peux pas dire qu'il soit informatif. Oui, et Google pour aider avec la requête - création de DLL C++.

D'ailleurs, en parlant du point d'entrée et ainsi de suite. Dans Visual Studio, un projet DLL est créé et tout ce dont vous avez besoin est créé par lui-même, il suffit de ne pas y toucher de vos mains). Bien que les fonctions d'interaction, les fils de discussion, etc. vous appartiennent. - dépendent de vous. Il s'agit de C++ ; il n'y a pas de telles fonctionnalités associées spécifiquement à la DLL.

Oui, je peux écrire la dll elle-même, avec un point d'entrée vide ;))
Mais l'information sur le point d'entrée n'est nulle part, juste tinny, aucun google donne, aucune littérature similaire ((.
J'ai exactement un problème avec le point d'entrée, comme vous écrivez les fonctions d'interaction, l'initialisation, l'allocation de mémoire, les threads, la désinitialisation, etc.
Je sais que tout cela est mis en œuvre dans un commutateur au point d'entrée et c'est tout, une impasse)).
Je ne sais même pas ce qu'il faut chercher à étudier.

 
Roman:

Oui, je peux écrire la dll elle-même, avec un point d'entrée vide ;))
Mais les informations sur le point d'entrée ne sont nulle part, juste l'enfer, ni google ni littérature similaire ((
J'ai exactement un problème avec le point d'entrée, comme vous écrivez les fonctions d'interaction, l'initialisation, l'allocation de mémoire, les threads, la désinitialisation, etc.
Je sais que tout cela est mis en œuvre dans un commutateur au point d'entrée et c'est tout, une impasse)).
Je ne sais même pas ce qu'il faut chercher à étudier.

Vous pensez que je sais quelque chose sur le point d'entrée ? Ce n'est pas l'affaire du roi). Il n'y a qu'une seule fonction unique dans la DLL qui le définit

// 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;
}

Il n'y a pas besoin de le comprendre). À l'avenir, dans la plupart des cas, il ne sera pas nécessaire de l'utiliser lors de l'écriture et de l'exploitation de la DLL. L'essentiel est de ne pas le toucher avec les mains).

 
Yuriy Asaulenko:

Tu crois que je sais quelque chose sur le point d'entrée ? Ce n'est pas l'affaire du roi). Il n'y a qu'une seule et unique fonction dans la DLL qui le définit

Il n'y a pas besoin de le comprendre). À l'avenir, dans la plupart des cas, il ne sera pas nécessaire de l'utiliser lors de l'écriture et de l'exploitation de la DLL. L'essentiel est de ne pas le toucher avec les mains).

Non, tu dois le comprendre, tu as écrit ta propre séquence d'actions, donc je pensais que tu le connaissais bien.
Dans ce point d'entrée, toutes les actions, l'initialisation des fonctions, l'allocation de mémoire, la création de threads, la désinitialisation, etc. sont effectuées.
Au moins, que lire sur ce sujet ?

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

Programmation asynchrone et multithread dans MQL

Yuriy Asaulenko, 2019.07.27 21:25

Vous créez un thread dans la DLL, vous lui transmettez les données, vous déconnectez le thread et vous l'oubliez - il se terminera tout seul après avoir terminé sa tâche.
Lorsque vous déconnectez le thread dans la DLL, le thread du terminal est libéré. L'ensemble du processus prend, je crois, moins d'une milliseconde.
A en juger par le fait que même sans déconnecter le thread, le processus d'écriture dans la base de données est de 4-5 ms. Eh bien, 60 ticks/s est suffisant pour ne pas être triste de l'appel asynchrone depuis le terminal.


 
Roman:

Non, vous devez la comprendre, vous avez écrit la séquence vous-même, donc je pensais que vous la connaîtriez bien.
Au moins, que lire sur le sujet ?

Il n'est pas nécessaire de le comprendre, de le modifier, etc. Vous créez un projet DLL dans VS, DllMain() est créé par lui-même. Toutes les applications Windows le prennent automatiquement en charge.

Votre tâche consiste à écrire des fonctions d'exportation et, en plus de celles-ci, tout code C++ dont vous avez besoin. Votre DLL est prête et va fonctionner.

La POO est conçue principalement pour appliquer des objets sans avoir la moindre idée de leur fonctionnement interne, afin que vous puissiez vous concentrer sur la résolution exacte de votre tâche, plutôt que d'apprendre tout et n'importe quoi. Nous conduisons une voiture, et nous n'avons peut-être aucune idée de son électronique et de la construction de son moteur. C'est la même chose dans le cas de la DLL.

Et la fonction DllMain() que j'ai citée plus haut est tirée d'un projet réel d'une DLL assez complexe, qui accomplit ses tâches.

 
Yuriy Asaulenko:

Il n'est pas nécessaire de le comprendre, de le modifier, etc. Vous créez un projet DLL dans VS, DllMain() est créé par lui-même. Toutes les applications Windows le prennent automatiquement en charge.

Votre tâche consiste à écrire les fonctions d'exportation et, à côté d'elles, tout code C++ dont vous avez besoin. Votre DLL est prête et va fonctionner.

La POO est conçue principalement pour appliquer des objets sans avoir la moindre idée de leur fonctionnement interne. Nous conduisons une voiture et nous n'avons peut-être aucune idée de son électronique et de la construction de son moteur. Dans le cas de la DLL, c'est la même chose.

C'est compréhensible, les fonctions elles-mêmes ne sont pas un problème, avec toutes les conventions comme dans les articles 1 et 2 il n'y a pas de problème avec cela.
Mais comme je le suppose, pour créer un fil pour lafonction appelée,
dans le cas de DLL_THREAD_ATTACH, nous devons faire quelques manipulations en C++.
allouer de la mémoire, créer un thread pour la fonction,
et ensuite nettoyer le tout dans DLL_THREAD_DETACH, donc ce n'est pas aussi facile que ça en a l'air.

Si je dis cela, c'est parce que j'ai essayé une bibliothèque asynchrone, dans laquelle les tâches sont exécutées de manière asynchrone,
J'ai voulu faire une dll à partir de cette bibliothèque, mais pour une raison quelconque, elle se plante toujours à la fin du programme, c'est-à-dire en supprimant Expert Advisor du graphique.
C'est pourquoi il est nécessaire de modifier le point d'entrée et de sortie.

 
Roman:

C'est pourquoi il faut jouer avec les points d'entrée et de sortie.

...c'est-à-dire en supprimant l'EA du graphique, mon terminal se plante.

Vous n'êtes pas obligé de le faire. Ce n'est pas le point d'entrée qui est à blâmer. Tu fais quelque chose de mal.

Cours, fils, etc., etc. - tout ceci est parfaitement créé et fonctionne bien dans la DLL sans aucun chamanisme. Mais, au moment où vous quittez, tous VOS processus dans la DLL doivent être terminés et les objets détruits. Lors du débogage de la DLL, cela se produit). En C/C++, tout contrôle est la tâche du programmeur, et non du programme.

ZS Je le fais comme ça. J'appelle une fonction DLL depuis une application, par exemple

bool job =true;

void Close() 
{
	 job = false;
	 delete Obj1;
	 delete Obj2;
	......
}
Avec job=false tous les processus sont terminés, avec delete tous les objets pour lesquels de la mémoire a été allouée sont supprimés, etc.
 
Yuriy Asaulenko:

Mais, au moment où vous partez, tous VOS processus dans la DLL doivent être terminés.

C'est probablement le problème, je ne le savais pas, je pensais que la dll terminait ses propres processus lorsqu'elle se désattache.
Je vais réfléchir à la manière de terminer tous les processus avant la sortie, merci pour le conseil.
Mais seulDLL_PROCESS_DETACH en est responsable, et nous devons tuer de force tous les processus dans ce cas.

 
Roman:

Mais c'est exactement ce dont DLL_PROCESS_DETACH est responsable, et tous les processus doivent être tués de force dans ce cas.

Il est responsable de la déconnexion de la DLL avec l'application. DllMain() est responsable du maintien du protocole de communication standard.DLL_PROCESS_DETACH concerne d'autres choses.) Vos processus ne s'y intéressent pas, cela ne regarde que vous.

Dans MT, il y a une fonction d'arrêt. Je pense que c'est OnClose(). Ici, à partir de celui-ci, tous les processus et se terminent en appelant la fonction appropriée DLL.

 
Yuriy Asaulenko:

Il est responsable de la déconnexion de la DLL de l'application. Il ne s'intéresse pas à vos procédés, cela dépend entièrement de vous.

OK, je vais essayer. Merci d'avoir pris le temps d'expliquer les points les plus délicats, merci.

Raison: