Programación asíncrona y multihilo en MQL - página 24

 
Roman:

No estudié para ser programador, estoy aprendiendo todo por mi cuenta, así que no me eches a la calle ))

Yo tampoco. Tengo una profesión diferente. La programación es sólo una herramienta, como un martillo).

Creación de DLL para MKL - hay DLL absolutamente estándar, sin características especiales. El resto es puro C++, o puro C# si se quiere.

Enseñar C++ o Sharp me supera, pero hay vagones de literatura, a cualquier nivel.

Hay un artículo en MKL sobre la creación de una simple DLL, no puedo decir nada de que sea informativo. Sí, y Google es una ayuda para la consulta - Creación de DLL en C++.

Por cierto, hablando del punto de entrada y demás. En Visual Studio se crea un proyecto DLL y todo lo que necesitas se crea por sí mismo, sólo no lo toques con las manos). Bueno, mientras que las funciones de interacción, los hilos, etc. dependen de ti. - dependen de ti. Esto es C++, no hay características asociadas específicamente con la DLL.

ZZY La mejor manera de aprender cualquier cosa es resolviendo una tarea específica. Ni siquiera lo he inventado yo).

 
Yuriy Asaulenko:

Yo tampoco. Tengo una profesión diferente. La programación es sólo una herramienta, como un martillo).

Creación de dlls para MKL - dlls absolutamente estándar allí, sin características especiales. El resto es puro C++, o puro C# si se quiere.

Enseñar C++ o Sharp me supera, pero hay vagones de literatura, a cualquier nivel.

Hay un artículo en MKL sobre la creación de una simple DLL, no puedo decir nada de que sea informativo. Sí, y Google para ayudar con la consulta - la creación de C++ DLL.

Por cierto, hablando del punto de entrada y demás. En Visual Studio se crea un proyecto DLL y todo lo que necesitas se crea por sí mismo, sólo no lo toques con las manos). Bueno, mientras que las funciones de interacción, los hilos, etc. dependen de ti. - dependen de ti. Se trata de C++; no hay características de este tipo asociadas específicamente a la DLL.

Sí, puedo escribir la propia dll, con un punto de entrada vacío))
Pero la información sobre el punto de entrada no está en ninguna parte, sólo tinny, sin google da, sin literatura similar ((.
Tengo exactamente un problema con el punto de entrada, ya que escribes funciones de interacción, inicialización, asignación de memoria, hilos, desinicialización, etc.
Sé que todo esto se implementa en un interruptor en el punto de entrada y eso es todo, un punto muerto)).
Ni siquiera sé qué buscar para estudiar.

 
Roman:

Sí, puedo escribir la propia dll, con un punto de entrada vacío ))
Pero la información sobre el punto de entrada no está en ninguna parte, solo en el infierno, ni en google ni en literatura similar ((
Tengo exactamente un problema con el punto de entrada, ya que escribes funciones de interacción, inicialización, asignación de memoria, hilos, desinicialización, etc.
Sé que todo esto se implementa en un interruptor en el punto de entrada y eso es todo, un punto muerto)).
Ni siquiera sé qué buscar para estudiar.

¿Crees que sé algo sobre el punto de entrada? No es asunto del rey). Sólo hay una función única en la DLL que lo define

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

No hay necesidad de entenderlo). En el futuro, en la mayoría de los casos no será necesario utilizarlo cuando se escriba y opere la DLL. Lo principal es no tocarlo con las manos).

 
Yuriy Asaulenko:

¿Crees que sé algo sobre el punto de entrada? No es asunto del rey). Sólo hay una función única en la DLL que lo define

No hay necesidad de entenderlo). En el futuro, en la mayoría de los casos no será necesario utilizarlo cuando se escriba y opere la DLL. Lo principal es no tocarlo con las manos).

No, tienes que entenderlo, has escrito tu propia secuencia de acciones, así que pensé que lo conocías bien.
En este punto de entrada se realizan todas las acciones,inicialización de funciones,asignación de memoria, creación de hilos, desinicialización, etc.
¿Al menos qué leer sobre este tema?

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias de comercio

Programación asíncrona y multihilo en MQL

Yuriy Asaulenko, 2019.07.27 21:25

Creas un hilo en la DLL y le pasas los datos, desconectas el hilo y te olvidas de él - terminará por sí mismo después de terminar su tarea.
Cuando se desconecta el hilo en la DLL, se libera el hilo del terminal. Todo el proceso dura, creo, menos de un milisegundo.
A juzgar por el hecho de que incluso sin desconectar el hilo, el proceso de escritura en la base de datos es de 4-5 ms. Bueno, 60 ticks/s es suficiente para no estar triste por la llamada asíncrona desde el terminal.


 
Roman:

No, tienes que entenderlo, tú mismo has escrito la secuencia, así que pensé que la conocerías bien.
¿Al menos qué leer sobre el tema?

No es necesario entenderlo, modificarlo, etc. Si creas un proyecto DLL en VS, DllMain() se crea por sí mismo. Todas las aplicaciones de Windows lo soportan automáticamente.

Tu tarea es escribir las funciones de exportación y además de ellas, cualquier código C++ que necesites. Su DLL está lista y funcionará.

La programación orientada a objetos está diseñada principalmente para aplicar objetos sin tener ninguna idea sobre su funcionamiento interno, de modo que pueda centrarse en resolver exactamente su tarea, en lugar de aprender todo y cualquier cosa. Conducimos un coche, y puede que no tengamos ni idea de su electrónica ni de la construcción del motor. Es lo mismo en el caso de la DLL.

Y la función DllMain() que he citado antes está sacada de un proyecto real de una DLL bastante compleja, que realiza sus tareas.

 
Yuriy Asaulenko:

No es necesario entenderlo, modificarlo, etc. Si creas un proyecto DLL en VS, DllMain() se crea por sí mismo. Todas las aplicaciones de Windows lo soportan automáticamente.

Tu tarea es escribir las funciones de exportación y, además de ellas, cualquier código C++ que necesites. Su DLL está lista y funcionará.

La POO está diseñada principalmente para aplicar objetos sin tener ninguna idea de su funcionamiento interno. Conducimos un coche y puede que no tengamos ni idea de su electrónica ni de la construcción del motor. En el caso de la DLL, es lo mismo.

Esto es comprensible, las funciones en sí no son un problema, con todas las convenciones como en los artículos 1 y 2 no hay ningún problema con esto.
Pero como supongo, para crear un hilo parala función llamada,
en el caso de DLL_THREAD_ATTACH, tenemos que hacer algunas manipulaciones en C++
asignar memoria, crear un hilo para la función,
y luego limpiarlo todo en DLL_THREAD_DETACH, así que no es tan fácil como parece.

Por qué lo digo, porque he probado una librería asíncrona, en la que las tareas se ejecutan de forma asíncrona,
Quería hacer una dll de esta librería, pero por alguna razón siempre se bloquea al final del programa, es decir, al borrar el Expert Advisor del gráfico.
Por ello, es necesario manipular el punto de entrada y salida.

 
Roman:

Por eso hay que juguetear con el punto de entrada y salida.

...es decir, eliminando el EA del gráfico, mi terminal se bloquea.

No es necesario. La culpa no es del punto de entrada. Estás haciendo algo mal.

Clases, hilos, etc., etc. - todo esto está perfectamente creado y funciona bien en la DLL sin ningún tipo de chamanismo. Pero, al salir, todos SUS procesos en la DLL deben ser terminados y los objetos deben ser destruidos. Al depurar la DLL esto sucede). En C/C++ todo el control es tarea del programador, no del programa.

ZS Yo lo hago así. Llamo a una función DLL desde una aplicación, por ejemplo

bool job =true;

void Close() 
{
	 job = false;
	 delete Obj1;
	 delete Obj2;
	......
}
Con job=false se terminan todos los procesos, con delete se borran todos los objetos para los que se asignó memoria, etc.
 
Yuriy Asaulenko:

Pero, para el momento en que se vaya, todos SUS procesos en el DLL deben estar completados.

Probablemente ese sea el problema, no lo sabía, creía que la dll completa sus propios procesos cuando se desvincula.
Voy a pensar en ello cómo terminar todos los procesos antes de salir, gracias por el consejo.
Pero sóloDLL_PROCESS_DETACH es responsable de ello, y necesitamos matar forzosamente todos los procesos en este caso.

 
Roman:

Peroesto es exactamente de lo que se encarga DLL_PROCESS_DETACH, y todos los procesos deben ser eliminados a la fuerza en este caso.

Es responsable de la desconexión de la DLL con la aplicación. DllMain() se encarga de mantener el protocolo de comunicación estándar.DLL_PROCESS_DETACH se encarga de otras cosas). Sus procesos no están interesados en ello, es únicamente su asunto.

En MT hay una función de apagado. Creo que es OnClose(). Aquí, a partir de ella, todos los procesos y terminar llamando a la función adecuada DLL.

 
Yuriy Asaulenko:

Se encarga de desconectar la DLL de la aplicación. No le interesan tus procesos, depende totalmente de ti.

Bien, lo probaré. Gracias por tomarse el tiempo de explicar los puntos más finos, gracias.

Razón de la queja: