Programação assíncrona e multi-tarefa em MQL - página 2

 
Koldun Zloy:

Vou traduzir o que já lhe foi dito por um representante da empresa de desenvolvimento MT:

Não é possível criar roscas a partir da MQL. Nem mesmo com o WinAPI.

Você só pode fazer isso escrevendo sua própria DLL.

WinAPI e usa dll padrão !

kernel32.dll
user32.dll

etc.

Pretende-se um trabalho multithreading com funções WinAPI, não com funções mql.
Mas é lamentável que você não possa trabalhar com funções mql.

 
Roman:

WinAPI e utiliza dlls padrão !

kernel32.dll
user32.dll

Hmm, exatamente o contrário, WinAPI é implementado como bibliotecas dinâmicas kernel32.dll , user32.dll...

Você nunca tentou escrever em C++ puro uma janela normal do Windows com o texto "Olá Palavra"! - Há exemplos na rede, escreva seu primeiro "Hello Word! - ele vai se limpar por si só ;)

 
Igor Makanu:

hmm, exatamente o contrário: WinAPI é implementado como bibliotecas dinâmicas kernel32.dll , user32.dll...

Você nunca tentou escrever em C++ puro uma janela normal do Windows com o texto "Olá Palavra"! - Há exemplos na rede, escreva seu primeiro "Hello Word! - muita coisa vai se esclarecer por si só ;)


Padrão significa dlls padrão do Windows, padrão não significa que são .lib estáticas

Igor, você está indo na direção errada...
O que o "Hello Word!" tem a ver com a inicialização da dll, e chamar funções a partir dela em sua thread!

Por exemplo:
Existe a função WinAPI MessageBoxW();
Ela deve ser chamada em seu próprio fio.

Para isso você precisa inicializar a própria dll e a função exportada, você pode dar um exemplo de como fazer isso corretamente?

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

Depois da inicialização, ligue para MessageBoxW(); com CreateThread();
Após a execução da função, solte o recurso e feche a rosca.
Dê-me um exemplo de como fazê-lo corretamente em mql ?

 
Atualmente, estou trabalhando em um sistema multi-tarefa. Mas não em MCL, mas em C++ padrão. Ah, quantos ancinhos existem).
 
Roman:


Padrão significa que a dll padrão do Windows, padrão não significa que eles são .lib estática

Igor, você está indo na direção errada...
O que o "Hello Word!" tem a ver com a inicialização da dll, e chamar funções a partir dela em sua thread!

Por exemplo:
Existe a função WinAPI MessageBoxW();
Ela deve ser chamada em seu próprio fio.

Para isso você precisa inicializar a própria dll e a função exportada, você pode dar um exemplo de como fazer isso corretamente?

Depois da inicialização, ligue para MessageBoxW(); com CreateThread();
Após a execução da função, solte o recurso e feche a rosca.
Dê-me um exemplo de como fazê-lo corretamente em mql ?

Você está no caminho errado, você foi avisado - escreva uma dll (na qual você deve alocar memória e registrar uma nova thread! - então destrua cuidadosamente tudo na saída!) e chame-o da MQL

onde alocação de memória e registro de processo estão em seu exemplo? A chamada MessageBox - significa que o programa MQL alocou seus recursos, mas não criou uma linha separada. Eu nem quero verificar, mas quando você chama MessageBox o terminal deve congelar

 
Igor Makanu:

Você está indo na direção errada, eu lhe disse - escreva uma dll e ligue da MQL

onde em seu exemplo está a alocação de memória e o registro do processo? o fato de você ter chamado a MessageBox - isso significa apenas que o programa MQL forneceu seus recursos, mas não criou uma linha separada. Eu nem quero verificar, mas quando você chama a MessageBox, seu terminal deve congelar

Igor, citei as funções da dll de inicialização como um exemplo para entender do que estou falando. Mas não sei como fazê-lo corretamente em mql, C++ puro pode ser enganoso.
A peculiaridade do próprio mql pode causar confusão. Foi por isso que pedi ajuda no fórum, não no Google.
Por que eu preciso escrever uma dll, quando o WinAPI é construído em dll, e as funções chamaveis já estão emuser32.dll, por exemplo
? Eu criei o tópico para entender a questão, como fazê-lo corretamente em mql, e você me diz onde está a alocação de memória e o registro do processo))).
Mostre-me um exemplo adequado de como fazer isso em mql?
Ou me direcione a um bom guia.

 
Roman:

Igor, eu dei as funções de inicialização dll como exemplo para entender o que quero dizer, mas não sei como fazê-lo corretamente em mql, C++ puro pode ser enganoso.
A peculiaridade do próprio mql pode causar confusão. Foi por isso que pedi ajuda no fórum, não no Google.
Por que eu preciso escrever uma dll, quando o WinAPI é construído em dll, e as funções chamaveis já estão em user32.dll, por exemplo
? Eu criei o tópico para entender a questão de como fazê-lo corretamente em mql, e você me diz onde está a alocação de memória e o registro do processo))).
Mostre-me um exemplo adequado de como fazer isso em mql?
Ou me direcione a um bom guia.

Você não pode criar um fio do programa mql, mesmo usando WinAPI.

 
Roman:

Igor, eu dei um exemplo de funções de inicialização dll para entender o que quero dizer, mas como fazê-lo corretamente em mql, não estou ciente, C++ puro pode ser enganoso.
A peculiaridade do próprio mql pode causar confusão. Foi por isso que pedi ajuda no fórum, não no Google.
Por que eu preciso escrever uma dll, quando o WinAPI é construído em dll, e as funções chamaveis já estão em user32.dll, por exemplo
? Eu criei o tópico para entender a questão, como fazê-lo corretamente em mql, e você me diz onde está a alocação de memória e o registro do processo))).
Mostre-me um exemplo adequado de como fazer isso em mql?
Ou me direcione a um bom guia.

Mais uma vez, isso não é feito por meio do MQL, você resolve o problema do outro lado - do lado da cauda, não da cabeça!

Você escreve uma dll - chame-a de MQL e passe os dados para a dll, e se você precisar continuar o programa MQL (cálculos complexos), você cria uma nova thread na dll e processa os dados nesta thread

Você pode ler como escrever uma dll - procure no fórum por "dll" e você encontrará cerca de 20 artigos

Não há tutoriais, mas o recurso que você utilizará para escrever uma dll, portanto procure por soluções sobre como criar threads e assim por diante.

 
Dmitry Fedoseev:

Você não pode criar um fluxo a partir de um programa mql, mesmo usando WinAPI.

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Programação assíncrona e multi-tarefa em MQL

MetaQuotes Software Corp., 2019.07.24 16:31

Você não pode chamar funções MQL a partir de uma DLL.

Mas é possível executar várias linhas através de chamadas DLL para que funcionem independentemente da MQL5 em seu ambiente.

Por exemplo, você prepara os dados da MQL, os coloca em algum lugar ou os passa para a DLL, que por sua vez executará a tarefa em várias roscas e retornará o resultado através de uma função adicional.


Chamar as funções API do Windows é uma chamada da dll, isso significa que os threads podem ser criados para funções API do Windows usandoCreateThread();
Não é por nada
que CreateThread(); foi portado para a biblioteca mql padrão.

 
Roman:

Achamada das funções API do Windows é uma chamada da dll, portanto para as funções API do Windows é possível criar threads usandoCreateThread();
CreateThread(); foi portada para a biblioteca mql padrãopor uma razão.

ninguém portou nada, o que você vê no pacote são apenas assinaturas de funções.

para criar um fluxo, você precisa de um corpo funcional - este é o corpo que irá funcionar no fluxo!

Para registrar um tópico no Windows, é necessário preencher a estrutura:

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

verlpStartAddress - este é o endereço do ponto de entrada da função que será executada na thread, não se preocupe com aalocação de memória

para resolver este problema, você precisa encontrar uma oportunidade de obter o endereço do MyFunc() - em memória, e ele está ausente - bem, em nenhum lugar ... nenhuma!


Não sei como explicar o problema de outra forma ... que realmente não existe ))))

Razão: