Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Você está errado. Já respondi com detalhes suficientes nos comentários acima por que foi feito dessa forma.
Agora ele não consome muitos recursos (agora também no Windows 10 ). Você leu o artigo (e os comentários também)?
//---
P.S. A propósito, o consumo de recursos da CPU em diferentes terminais (MT4/MT5) e versões do sistema operacional (Windows) é muito diferente em condições iguais. No Windows 7, o terminal MetaTrader 4 se mostrou significativamente melhor do que o MetaTrader 5. Infelizmente, não posso lhe dar os números agora, pois já mudei completamente para o Windows 10.
Quanto à otimização, ainda não esgotei todas as opções. Ainda há algo a ser otimizado e eu sei como.
Para implementar a rolagem acelerada de algo e para alterar suavemente a cor de um objeto sob o cursor, é necessário um cronômetro. Tudo está correto aqui.
Mas ele não pode causar um consumo de recursos de até 10% no estado ocioso. Portanto, o problema está em outro lugar. Qual é o problema?
Ou seja, a cada evento do timer, você verifica os eventos de todos os elementos da interface? Por quê?
O que há nessa verificação que pode carregar o processador?
Por exemplo, mover o cursor do mouse na área de um gráfico limpo, quando não há nada nele (objetos gráficos e aplicativos MQL) já aumenta o consumo da CPU em até 6-7%:
Antes do teste:
Durante o teste:
Para implementar a rolagem acelerada de algo e alterar suavemente a cor do objeto sob o cursor, é necessário um cronômetro. Tudo está correto aqui.
Mas ele não pode causar um consumo de recursos de até 10% no estado ocioso. Portanto, o problema está em outro lugar. Qual é o problema?
Ou seja, a cada evento do timer, você verifica os eventos de todos os elementos da interface? Por quê?
Agora ele foi implementado de modo que somente no momento em que o cursor é movido. E isso é apenas no Windows 10. No Windows 7, esse não era o caso.
E se você usar o método que sugeriu, os mesmos custos serão gastos na preparação de uma matriz com os elementos sobre os quais o cursor está agora localizado + alguns outros problemas aparecem. Eu já testei esse método e desisti dele, pois não há ganho real.
Há outras opções, mas elas ainda precisam ser testadas. Se houver algum ganho, ele será apresentado em um dos próximos artigos.
Por exemplo, mover o cursor do mouse na área de um gráfico limpo, quando não há nada nele (objetos gráficos e aplicativos MQL) já aumenta o consumo da CPU em até 6-7%:
Antes do teste:
Durante o teste:
Infelizmente, esse fato não pode ser otimizado.
Entretanto, a verificação dos estados dos elementos de controle em eventos de timer (na minha opinião, muito frequentes. Em vez de 16 ms, você pode colocar 25 ms. ) não deve aumentar o consumo de recursos de forma alguma, se nenhuma ação que consuma recursos for executada durante essa verificação.
...
O que há nesse teste que pode sobrecarregar o processador?
...
No entanto, a verificação dos estados dos elementos de controle nos eventos do timer (acho que é muito frequente. Em vez de 16 ms, você pode definir 25 ms. ) não deve aumentar o consumo de recursos de forma alguma,
se nenhuma ação que consuma recursos for executada durante essa verificação.
Agora, ele foi implementado de modo que somente no momento de mover o cursor. Isso ocorre apenas no Windows 10. No Windows 7, esse não era o caso.
E se você usar o método que sugeriu, os mesmos custos serão gastos na preparação de uma matriz com os elementos sobre os quais o cursor está agora localizado + alguns outros problemas aparecem. Eu já testei esse método e desisti dele, pois não há ganho real.
Há outras opções, mas elas ainda precisam ser testadas. Se houver algum ganho, ele será apresentado em um dos próximos artigos.
1 - E aqui, você já está errado. A preparação da matriz de mapas com coordenadas e tamanhos de elementos, bem como o ajuste de seus valores nos eventos de movimentação de janelas, não aumenta significativamente a carga do processador, pois o trabalho é feito somente no evento de movimentação do cursor e somente quando se agarra a alça da janela. No caso de qualquer outro movimento do cursor, a função de recálculo de coordenadas não será chamada.
2. Quando o cursor for simplesmente movido, será chamada a função de localização, que percorrerá o mapa de elementos e encontrará o objeto sob o cursor. Esse processo é puramente computacional e não carrega o processador.
Реter Konow:
A preparação de uma matriz de mapa com coordenadas e tamanhos de elementos, bem como a correção de seus valores nos eventos de movimentação da janela, não aumenta significativamente a carga do processador, pois o trabalho é feito somente no evento de movimentação do cursor e somente quando se pega a alça da janela.
É por isso que não há sentido nisso. O objetivo não é aumentar a carga no processador, mesmo que seja insignificante, mas, ao contrário, reduzi-la. Acontece que não estou enganado. )
Redesenhar o gráfico para mostrar as alterações.
Por que redesenhar todo o gráfico quando as alterações podem ser feitas ponto a ponto, em relação a um elemento específico?
Você pode verificar a necessidade de alterações a cada 16 ms (a verificação não é carregada), mas aplicar a alteração a cada objeto específico somente quando necessário e não redesenhar o gráfico inteiro.
Por que redesenhar o gráfico inteiro quando as alterações podem ser feitas ponto a ponto, em relação a um elemento específico?
Após cada alteração no gráfico, você precisa chamar a função ChartRedraw() para exibição instantânea. O mesmo se aplica ao desenho na tela. Portanto, as alterações são feitas primeiro em todos os elementos e só então, uma vez, o gráfico é redesenhado.
Tag Konow:
Você pode verificar a necessidade de alterações a cada 16 ms (a verificação não é carregada), mas aplicar a alteração a cada objeto específico somente quando necessário e não redesenhar o gráfico inteiro.
No momento, nada é redesenhado a cada 16 ms em repouso. Não é como se o usuário fosse cortar círculos com o cursor do mouse no gráfico sem parar. Na implementação atual, o consumo de recursos da CPU não excede 6-7%.
Após cada alteração no gráfico, você deve chamar a função ChartRedraw() para exibição instantânea. O mesmo se aplica ao desenho na tela. É por isso que as alterações são feitas primeiro em todos os elementos e só depois, uma vez, o gráfico é redesenhado.
Isso é muito, muito estranho. Não tenho uma única chamada para a função ChartRedraw() em minha implementação da interface.
Eu realmente não sabia por que ela era necessária até agora..... Trabalho com telas (objetos bitmap) sem ela.
Vamos supor que a função ChartRedraw() seja necessária, - então acontece que cada alteração de cada objeto requer um redesenho completo de todos os objetos?