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

 
Yuriy Asaulenko:


Comecei a reler o tema e Igor já havia escrito sobre ele.

Пишите dll (в которой Вы должны выделить память и зарегистрировать новый поток! - затем при выходе все аккуратно уничтожить!) и вызывайте ее из MQL

Isto é o que eu estava tentando dizer, Yuri, que precisamos alocar a memória e registrar o fluxo.
Igor diz que você precisa alocar e registrar, enquanto você diz que não precisa fazer nada.
É por isso que minha cabeça está girando. O resultado é um impasse.

Igor estudou na universidade como um especialista, e ele deveria entender mais sobre isso do que nós, autodidatas.
Desde o início, eu estava inclinado à mesma idéia - que a memória deve ser alocada e inicializada.
Inicialização ealocação de memória é a chave para corrigir a codificação, pois ela não deve fluir e não deve ser lixo.

Então minha pergunta a Igor, por favor explique como fazer isso em C++?
Não em palavras, com um exemplo, eu não entendo nada ))

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;
}
 
Roman:

Comecei a reler o tema e Igor já escreveu sobre ele.

Era isso que eu estava tentando dizer, Yuri, que deveríamos alocar a memória e registrar o fluxo.

Sim, é claro que sim. Mas o DllMain não tem nada a ver com isso). - É para outra coisa. E não para você. Esqueça isso, melhor para o bem). Ela não existe para você.
Escrever uma função de exportação. O resto é exatamente o mesmo que nos programas normais. Você precisa fazer o mesmo lá também.
O resto depois, já estou dormindo)).
 
Tome C# porque C/C+++ é muito complicado para você.
 
Roman:

Comecei a reler o fio e Igor já havia escrito sobre ele.

Inicialmente eu estava inclinado à mesma idéia: alocar memória e inicializar.
Inicialização e alocação de memória é a chave para corrigir a codificação, pois não deve pingar e estar livre de lixo.

Então minha pergunta a Igor, por favor explique como fazer isso em C++?

Você está empurrando magistralmente este tópico para o topo da discussão, tentando atrair mais e mais participantes para seu problema ))))

Não tire a correspondência fora do contexto:

- Eu escrevi no contexto que se você quiser entender como o WinAPI funciona, você pode usar exemplos prontos na escrita da dll = mais de 20 artigos sobre este recurso

- Eu o escrevi em um contexto onde você pode chegar a chamadas WinAPI puras, substituindo plugins que seus programadores de sistema já escreveram para você

....

o objetivo da correspondência: começar a ler e fazer algo, não escrever e escrever.... Você entenderá muito, entenderá o que e como funciona no Windows, mas este conhecimento não será exigido, devocê como do programador de aplicações, apenas trabalho mecânico é necessário - escolha o tipo de projeto, acrescente seu código, compilado = obteve o resultado - todo o trabalho foi feito para você por centenas ou milhares de programadores de sistemas. Qualquer modificação dos modelos e incluir arquivos deve fazer sentido - se você não sabe, sob o pretexto de "por que tanto código, ele já funciona"! - Você terá um bug não reprodutível e/ou falta de compatibilidade OS/PC

 
Vladimir Simakov:
O posto é para os criadores. Trolls à distância. Para GUIs, parece bom colocar o OnChartEvent em uma linha separada.

Por que quebrar o modelo que os desenvolvedores fizeram? - O modelo do programa MQL é simples e claro, há eventos - há pontos de entrada que processam esses eventos (OnTick(),OnInit()....OnChartEvent() )

há a possibilidade de obter o estado do ambiente comercial de qualquer programa MQL (mesmo os indicadores podem ver o lucro de uma ordem aberta, etc.) e é possível combinar Expert Advisor+script, Expert Advisor+indicador de usuário no mesmo gráfico - você obtém a execução assíncrona de programas MQL, a EA negocia, o indicador exibe a visualização gráfica - se o desempenho do fluxo deindicadores do usuário não for suficiente (eles funcionam em um único tópico), então é claro que é um problema - você precisa usar 2 EAs em 2 gráficos e organizar a interação deles

novamente - há uma tarefa específica, há uma implementação, eu já perguntei muitas vezes por que essa característica é necessária, mas até agora não há resposta - apenas raciocínio espacial sobre a visualização 3D.... e não há discussão sobre onde obter algum DirectX para trabalhar com 3D ;)

imho, funciona! )))

 
Igor Makanu:

Por que quebrar o modelo que os desenvolvedores fizeram? - O modelo do programa MQL é simples e claro, há eventos - há pontos de entrada que processam esses eventos (OnTick(),OnInit()....OnChartEvent() )

há a possibilidade de obter o estado do ambiente comercial de qualquer programa MQL (mesmo os indicadores podem ver o lucro de uma ordem aberta, etc.) e é possível combinar Expert Advisor+script, Expert Advisor+indicador de usuário no mesmo gráfico - você obtém a execução assíncrona de programas MQL, a EA negocia, o indicador exibe a visualização gráfica - se o desempenho do fluxo deindicadores do usuário não for suficiente (eles funcionam em um único tópico), então é claro que é um problema - você precisa usar 2 EAs em 2 gráficos e organizar a interação deles

novamente - há uma tarefa específica, há uma implementação, eu já perguntei muitas vezes por que essa característica é necessária, mas até agora não há resposta - apenas raciocínio espacial sobre a visualização 3D.... e não há discussão sobre onde obter algum DirectX para trabalhar com 3D ;)

imho, funciona! )))

Veja. Há um botão. Você clica nele. OnChartEvent entra na fila de espera. Mas nesta fila já existe o OnTick, e depois dele existe o OnTime, e neles existe o CopyRate para todas as ferramentas, que para um segundo bloco e loops para uma merda de uma tonelada de iterações. Como resultado, se o botão, por exemplo, abrir uma janela de diálogo, obtemos uma interface lenta. Não é crítico, é claro, mas não é agradável.
 
Vladimir Simakov:
Veja. Há um botão. Você clica nele. O OnChartEvent entra em fila de espera. Mas nesta fila já existe o OnTick, e depois dele existe o OnTime, e neles existe o CopyRate para todas as ferramentas, que, por um segundo, bloqueia e faz loops para uma merda de uma tonelada de iterações. Como resultado, se o botão, por exemplo, abrir uma janela de diálogo, obtemos uma interface lenta. Não é crítico, é claro, mas não é agradável.

A GUI deve girar na EA principal e tudo mais em uma EA separada. Esta EA escrava separada é colocada emOBJ_CHART invisível e interage com o caminho principal EventSendCustom().

Recebe algo como uma multi-tarefa. Eu a implementei dessa forma.

 
Vladimir Simakov:
Veja. Há um botão. Você clica nele. OnChartEvent entra na fila de espera. Mas nesta fila já existe o OnTick, e depois dele existe o OnTime, e neles existe o CopyRate para todas as ferramentas, que, por um segundo, bloqueia e faz loops para uma porra de iterações. Como resultado, se o botão, por exemplo, abrir uma janela de diálogo, obtemos uma interface lenta. Não é crítico, é claro, mas não é agradável.

Eu não sei OnChartEvent OnTick e OnTime, mas os desenvolvedores escreveram que se a EA estava ocupada e não processou o evento, este evento não cria uma fila, ou seja, será apenas um carrapato ou um salto de tempo ( OnChartEvent - não sei, não verifiquei)


A lógica dos desenvolvedores é simples aqui, cada evento é uma ação específica do Expert Advisor, mas é este evento que eu sei com certeza e já verifiquei mais de uma vez (eu trabalho mais em teoria no MT5, não sei como ONTick funciona fisicamente):

sobre o MT4 direi sem ambigüidade: todas as operações comerciais devem ser feitas somente através de tick de entrada, caso contrário, em 9 de cada 10 casos você receberá a recusa do servidor em processar a operação comercial,

ou seja, eu criei uma interface com o botão COMPRAR - de acordo com minha idéia, você pressiona COMPRAR e imediatamente envia um pedido, mas ele não funcionará diretamente, você precisa memorizar o comando do usuário (idealmente, bloquear o botão para que ele não goste)) e na chegada de um tick no OnTick () - enviar um pedido ao servidor - isso funcionará em 99% dos casos, ou seja, um tick chegou - você pode realizar um pedido de troca (não de qualquer lugar no MQL)



E se introduzirmos o OnChartEvent em um fluxo assíncrono, obteremos bloqueios mútuos do código executado? - Por exemplo, as estatísticas comerciais são obtidas pressionando o botão no OnChartEvent , e a mesma função (última troca perdida) é usada no OnTick - será algo sério! - imho, você não pode consertar tudo!

 
Andrey Barinov:

A GUI deve girar na EA principal e tudo mais em uma EA separada. Esta EA escrava separada é colocada emOBJ_CHART invisível e interage com o caminho principal EventSendCustom().

Recebe algo como uma multi-tarefa. Eu a implementei dessa forma.

Exatamente. Por falta de uma empregada... É chamada de muleta.
 
Igor Makanu:

Eu não sei OnChartEvent OnTick e OnTime, mas os desenvolvedores escreveram que se a EA estava ocupada e não processou o evento, este evento não cria uma fila, ou seja, será apenas um carrapato ou um salto de tempo ( OnChartEvent - não sei, não verifiquei)


A lógica dos desenvolvedores é simples aqui, cada evento é uma ação específica do Expert Advisor, mas é este evento que eu sei com certeza e já verifiquei mais de uma vez (eu trabalho mais em teoria no MT5, não sei como ONTick funciona fisicamente):

sobre o MT4 direi sem ambigüidade: todas as operações comerciais devem ser feitas somente através de tick de entrada, caso contrário, em 9 de cada 10 casos você receberá a recusa do servidor em processar a operação comercial,

ou seja, eu criei uma interface com o botão COMPRAR - de acordo com minha idéia, você pressiona COMPRAR e imediatamente envia um pedido, mas ele não funcionará diretamente, você precisa memorizar o comando do usuário (idealmente, bloquear o botão para que ele não goste)) e na chegada de um tick no OnTick () - enviar um pedido ao servidor - isso funcionará em 99% dos casos, ou seja, um tick chegou - você pode realizar um pedido de troca (não de qualquer lugar no MQL)



E se introduzirmos o OnChartEvent em um fluxo assíncrono, obteremos bloqueios mútuos do código executado? - Por exemplo, as estatísticas comerciais são obtidas pressionando o botão no OnChartEvent , e a mesma função (última troca perdida) é usada no OnTick - será algo sério! - imho, você não pode consertar tudo!

A sincronização é a tarefa do programador, se você não sabe como, você não usa multithreading. A tarefa dos criadores é dar uma ferramenta, e então cada um é um sapateiro malvado. O mesmo a la mutex não é um problema de forma alguma.