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

 
Реter Konow:

É realmente assim tão perigoso? Erros na liberação de memória...

O exemplo está relacionado aos princípios gerais de captura do contexto do dispositivo e recursos alocados no Windows, ao programar threads independentes o desenvolvedor deve garantir que o contexto e os recursos do dispositivo sejam liberados quando exigido pelo sistema operacional, se o desenvolvedor usar comandos de baixo nível ele mesmo deve liberar todos os recursos usados... aqui novamente ao ponto que escrevi - escreva uma vez usando as informações do Google "Hello World"https://www.mql5.com/ru/forum/318593/page5#comment_12572558 e você entenderá muito, você entenderá que 99% do trabalho para você foi feito por programadores de sistemas

Isto é, trabalhando em ambiente MQL - os programadores da Metakvot fizeram isso por você - eles asseguraram que o terminal funcionará no caso do programa MQL não funcionar corretamente

 
Andrey Pogoreltsev:

Multithreading - tarefas executadas em múltiplas roscas. Pode funcionar em um único processador, ainda multithreading e alternando entre eles à medida que as cotas de tempo do processador se esgotam. Requer sincronização para acesso a recursos compartilhados. Pode levar a bloqueios, condição racial, bugs de liberação de memória e outras "surpresas".

Assíncrono - execução de função não bloqueada (ou seja, o controle é imediatamente retornado após a saída do método), geralmente em outros dispositivos (equipamentos de rede, dispositivos de armazenamento, periféricos, etc.). Por exemplo, é possível escrever um servidor multi-usuário de alto desempenho usando apenas uma conexão de cliente thread e máquina final de processamento. Tudo depende da finalidade deste servidor.

No seu caso, você precisa criar um grande número de conexões usando WinAPI e pode verificar o estado dessas conexões com WaitForMultipleObjects com um timeout, para que você não tenha que segurar uma rosca temporizada, por exemplo.

PS. Teoricamente, você também poderia usar o IOCompletionPort, mas ele requer mais conhecimento e design cuidadoso.

Bem... vocês se encontraram.

 
Talvez as pessoas não tenham vitaminas ou micronutrientes suficientes.
 
Roman:

Obrigado pela resposta informativa ))
Vá em frente e explique o que está lá e onde.
E como escrever código assíncrono comEventloop por meios padrão?

Tudo isso está na documentação.

Você pode começar lendo-o e tentando escrever algo.

E se não puder, você pode perguntar no fórum.

Até agora, não estamos falando de nada.


 
Koldun Zloy:

Tudo isso está na documentação.

Você pode começar lendo-o e tentando escrever algo.

E se não puder, você pode perguntar no fórum.

Até agora, não estamos falando de nada.


Para que você acha que o tópico foi criado?
Você nos diz como escrever código assíncrono da maneira regular, e o mostra na documentação.
Além do envio assíncrono de solicitações, mostrar onde a Callback funciona, onde controla o EventLoop, onde Wait, etc.
Tenho certeza de que você não poderá responder a isso porque não existe tal funcionalidade para os usuários, e não está nos documentos.
Exatamente a conversa é sobre nada, a única pessoa aqui na linha éAndrey Pogoreltsev, que entende o tema da comunicação.

 
Euentloop! Alguém tem um Euentloop? Um homem não está bem aqui sem um Euentloop! Alguém me dê um Euentloop!
 

Roman, 2019.07.27 09:30

Para que você acha que o tópico foi criado?


Você perguntou sobre a multithreading. Não há nenhum.

Mas também não é com isso que você precisa se preocupar neste momento.

Roman, 2019.07.27 09:30

Você nos diz como escrever código assíncrono usando o meio padrão e o mostra na documentação.
Além do envio assíncrono de solicitações, mostre-nos onde a Callback funciona, onde controla o EventLoop, onde Wait, etc.
Tenho certeza de que você não pode dar uma resposta a isso porque não existe tal funcionalidade para os usuários, e não está nos documentos.
Exatamente a conversa é sobre nada, a única pessoa aqui na linha é Andrey Pogoreltsev, que entende o tópico de comunicação.

Posso mostrar tudo isso para você. Mas qual é o objetivo?

Se você precisasse, você mesmo o encontraria.

Obviamente, você não leu a documentação ou os artigos.
 
Koldun Zloy:

Você perguntou sobre a multithreading. Não há multithreading.

A multi-tarefa é comohttps://www.mql5.com/ru/docs/runtime/running , ou seja, queremos paralelizar a tarefa, abrir vários gráficos (infelizmente ainda não tentei usar os recursos dos Serviços - talvez seja ainda mais fácil com eles? ) e anexar nossos EAs trabalhando em threads separados a eles, depois resolver o problema de sincronização e troca de dados (tarefas)

Eu perguntei cinco vezes ao TS - por que o terminal comercial precisa dele. ele não sabe, porque não há tarefa ou propósito específico

Eu vejo isso em aplicações cliente-servidor que não é típico do terminal de negociação, talvez seja conveniente para alguém enviar estatísticas para o servidor? - Bem, eu já escrevi um exemplo pronto (artigo)https://www.mql5.com/ru/articles/5337

As fontes são legíveis e o artigo tem excelente qualidade; as fontes podem ser modificadas para realizar cálculos paralelos em vários threads.... o que devemos calcular agora? )))

 
Igor Makanu:

O exemplo está relacionado aos princípios gerais de captura de contexto de dispositivo e recursos alocados no Windows, quando programando threads independentes o desenvolvedor deve assegurar-se de liberar o contexto e os recursos do dispositivo quando requerido pelo sistema operacional, se o desenvolvedor usar comandos de baixo nível ele deve liberar todos os recursos usados por ele mesmo... aqui novamente ao ponto que escrevi - escreva uma vez usando as informações do Google "Hello World" https://www.mql5.com/ru/forum/318593/page5#comment_12572558 e você entenderá muito, você entenderá que 99% do trabalho para você foi feito por programadores de sistemas

Em outras palavras, trabalhando em ambiente MQL os programadores Metakvot fizeram isso por você - eles asseguraram o funcionamento estável do terminal com um trabalho inadequado dos programas MQL

OK, sem argumentos, convencido. A correção dos fios por si só pode não ser viável para codificadores autodidatas e pode levar a erros críticos. "Os fósforos não são brinquedos para crianças". No entanto, precisamos de alguma forma de conseguir multithreading dentro de um único programa.

Há uma lógica simples: o lançamento seqüencial de serviços não causa erros, e cada serviço funciona em seu fio condutor. Portanto, o mecanismo já está configurado e depurado. Bom. Precisamos dar um passo adiante: escrever estes serviços no código do Expert Advisor em módulos especiais. Cada módulo será o mesmo serviço. Então, devemos compilar sequencialmente estes módulos e executá-los simultaneamente. É isso aí.

Em essência, nada muda. Somente os serviços serão escritos dentro do código da coruja. Eles compilariam e trabalhariam da mesma maneira. Eles serão excluídos quando a EA for removida da tabela. Desta forma, obtemos uma EA multi-tarefa.

 
Você pode torná-lo ainda mais simples. O próprio Expert Advisor carrega os serviços necessários, que são escritos separadamente. Quando removidos da tabela, eles param. A única coisa a fazer é acrescentar o início dos serviços do Expert Advisor. E a interação interna entre os fios é uma tarefa do programador. É resolvido com a ajuda de recursos.