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

 
Koldun Zloy:

Voy a traducir lo que ya le ha dicho un representante de la empresa de desarrollo de MT:

No se pueden crear hilos desde MQL. Ni siquiera con WinAPI.

Sólo puede hacerlo escribiendo su propia DLL.

¡WinAPI y utiliza la dll estándar !

kernel32.dll
user32.dll

etc.

Se pretende trabajar con multithreading con funciones WinAPI, no con funciones mql.
Pero es lamentable que no se pueda trabajar en multihilo con las funciones mql.

 
Roman:

¡WinAPI y utiliza dlls estándar !

kernel32.dll
user32.dll

Hmm, exactamente lo contrario, WinAPI se implementa como bibliotecas dinámicas kernel32.dll , user32.dll...

Nunca has intentado escribir en C++ puro una ventana habitual de Windows con el texto "¡Hola Word!" - Hay ejemplos en la red, escribe tu primer "¡Hola Word! - se aclarará solo ;)

 
Igor Makanu:

hmm, exactamente lo contrario: WinAPI se implementa como bibliotecas dinámicas kernel32.dll , user32.dll...

Nunca has intentado escribir en C++ puro una ventana habitual de Windows con el texto "¡Hola Word!" - Hay ejemplos en la red, escribe tu primer "¡Hola Word! - muchas cosas se aclaran solas ;)


Estándar significa dlls estándar de Windows, estándar no significa que sean estáticas .lib

Igor, vas por el camino equivocado...
¡Qué tiene que ver "¡Hola Word!" con la inicialización de la dll, y llamar a funciones desde ella en su hilo !

Por ejemplo:
Existe la función WinAPI MessageBoxW();
Debe ser llamado en su propio hilo.

Para ello hay que inicializar la propia dll y la función exportada, ¿puedes dar un ejemplo de cómo hacerlo correctamente?

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

Después de la inicialización, llame a MessageBoxW(); con CreateThread();
Una vez ejecutada la función, libera el recurso y cierra el hilo.
¿Me das un ejemplo de cómo hacerlo correctamente en mql?

 
Actualmente estoy trabajando en un sistema multihilo. Pero no en MCL, sino en C++ estándar. Ah, cuántos rastrillos hay).
 
Roman:


Estándar significa la dll estándar de Windows, estándar no significa que sean estáticas .lib

Igor, vas en la dirección equivocada...
¡Qué tiene que ver "¡Hola Word!" con la inicialización de la dll, y llamar a funciones desde ella en su hilo !

Por ejemplo:
Existe la función WinAPI MessageBoxW();
Debe ser llamado en su propio hilo.

Para ello hay que inicializar la propia dll y la función exportada, ¿puedes poner un ejemplo de cómo hacerlo correctamente?

Después de la inicialización, llame a MessageBoxW(); con CreateThread();
Tras la ejecución de la función, libera el recurso y cierra el hilo.
¿Me das un ejemplo de cómo hacerlo correctamente en mql?

Te han dicho que estás en la dirección equivocada: escribe una dll (¡en la que debes asignar memoria y registrar un nuevo hilo! - y luego destruir cuidadosamente todo al salir) y llamarlo desde MQL

¿Dónde están la asignación de memoria y el registro de procesos en tu ejemplo? La llamada a MessageBox - significa que el programa MQL ha asignado sus recursos pero no ha creado un hilo separado. No quiero ni comprobarlo, pero el terminal debería congelarse cuando se llama a MessageBox

 
Igor Makanu:

Vas por el camino equivocado, te lo dije - escribe una dll y llámala desde MQL

¿en qué parte de tu ejemplo está la asignación de memoria y el registro de procesos? el hecho de que hayas llamado a MessageBox - esto sólo significa que el programa MQL ha proporcionado sus recursos pero no ha creado un hilo separado. No quiero ni comprobarlo, pero cuando llamas a MessageBox, tu terminal debería congelarse

Igor, he citado las funciones de inicialización de la dll como ejemplo para que se entienda lo que digo, pero no sé cómo hacerlo correctamente en mql, el C++ puro puede ser engañoso.
La peculiaridad de mql en sí misma puede causar confusión. Por eso pedí ayuda en el foro, no en Google.
¿Por qué necesito escribir una dll, cuando WinAPI se construye en la dll, y las funciones invocables ya están enuser32.dll, por ejemplo
? He creado el tema para entender la pregunta, cómo hacerlo correctamente en mql, y me dices dónde está la
asignación de memoria y el registro de procesos)).
¿Mostrarme un ejemplo adecuado de cómo hacerlo en mql?
O dirigirme a una buena guía.

 
Roman:

Igor, puse las funciones de inicialización de la dll como ejemplo para entender lo que quiero decir, pero no sé cómo hacerlo correctamente en mql, el C++ puro puede ser engañoso.
La peculiaridad de mql en sí misma puede causar confusión. Por eso pedí ayuda en el foro, no en Google.
¿Por qué necesito escribir una dll, cuando WinAPI se construye en la dll, y las funciones invocables ya están en user32.dll, por ejemplo
? He creado el tema para entender la pregunta, cómo hacerlo correctamente en mql, y me dices dónde está la
asignación de memoria y el registro de procesos)).
¿Mostrarme un ejemplo adecuado de cómo hacerlo en mql?
O dirigirme a una buena guía.

No se puede crear un hilo desde el programa mql, ni siquiera usando WinAPI.

 
Roman:

Igor, puse un ejemplo de funciones de inicialización de dlls para que se entienda lo que quiero decir, pero cómo hacerlo correctamente en mql, no estoy al tanto, el C++ puro puede ser engañoso.
La peculiaridad de mql en sí misma puede causar confusión. Por eso pedí ayuda en el foro, no en Google.
¿Por qué tengo que escribir una dll, cuando WinAPI se construye en la dll, y las funciones invocables ya están en user32.dll, por ejemplo
? He creado el tema para entender la cuestión de cómo hacerlo correctamente en mql, y me dices dónde
asignar memoria y registrar el proceso.
¿Mostrarme un ejemplo adecuado de cómo hacerlo en mql?
O dirigirme a una buena guía.

Una vez más, esto no se hace mediante MQL, se resuelve el problema desde el otro lado - ¡desde la cola, no desde la cabeza!

Escribes una dll - la llamas desde MQL y pasas datos a la dll, y si necesitas continuar el programa MQL (cálculos complejos), creas un nuevo hilo en la dll y procesas los datos en este hilo

Puedes leer cómo escribir una dll - busca en el foro "dll" y encontrarás unos 20 artículos

No hay tutoriales, pero el recurso que utilizará para escribir una dll, así que busque soluciones sobre cómo crear hilos y así sucesivamente.

 
Dmitry Fedoseev:

No se puede crear un flujo desde un programa mql, ni siquiera usando WinAPI.

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

Programación asíncrona y multihilo en MQL

MetaQuotes Software Corp., 2019.07.24 16:31

No puedes llamar a funciones MQL desde una DLL.

Pero es posible ejecutar múltiples hilos a través de llamadas DLL para que funcionen independientemente de MQL5 en su entorno.

Por ejemplo, usted prepara los datos desde MQL, los coloca en algún lugar o los pasa a la DLL, que a su vez ejecutará la tarea en múltiples hilos y devolverá el resultado a través de una función adicional.


Llamar a las funciones de la API de Windows es una llamada desde la dll, significa que se pueden crear hilos para las funciones de la API de Windows utilizandoCreateThread();
No en v
anoCreateThread(); fue portado a la biblioteca estándar de mql.

 
Roman:

Lallamada de las funciones de la API de Windows es una llamada desde la dll, por lo que para las funciones de la API de Windows es posible crear hilos utilizandoCreateThread();
CreateThread(); fue portado a la biblioteca estándar de mqlpor una razón.

nadie portó nada, lo que se ve en el paquete son sólo firmas de funciones.

para crear un flujo, necesita un cuerpo de función - ¡este es el cuerpo que se ejecutará en el flujo!

Para registrar un hilo en Windows hay que rellenar la estructura:

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

verlpStartAddress - esta es la dirección del punto de entrada de la función que se ejecutará en el hilo, no te preocupes por laasignación de memoria

para resolver este problema, es necesario encontrar una oportunidad para obtener la dirección de MyFunc() - en la memoria, y está ausente - bueno, en ninguna parte ... ¡ninguno!


No sé de qué otra manera explicar el problema... que no existe realmente ))))