A lona é legal! - página 90

 
Nikolai Semko #:

Uma tela é um objeto ao qual está vinculada uma matriz de pixels. O Resource é responsável por vincular essa matriz de pixels (consulte bool CCanvas::Create())
É uma má prática excluir e recriar uma tela o tempo todo.
É uma boa prática criar uma tela quando ela for necessária e excluí-la quando não for mais necessária, por exemplo, no final do programa.

Depois de criar um objeto canvass, você pode limpá-lo, substituir a matriz de pixels a cada quadro, redimensionar a tela e movê-la para onde quiser.

Obrigado, ficou um pouco mais claro, mas não tudo. Entendi corretamente que, se depois de criar um objeto de tela, eu simplesmente excluir o objeto do gráfico usando ObjectDelete(), a matriz de pixels vinculada a esse objeto permanecerá intacta e... Quando crio um novo objeto de tela com um nome diferente novamente, uma nova matriz de pixels é criada na memória e, portanto, teoricamente, é possível preencher toda a memória?

Ou a matriz de pixels antiga é simplesmente vinculada novamente ao último objeto de tela criado a cada vez (porque é e somente com ela que todas as funções da instância usada da classe de tela começam a funcionar)?

 
leon_17 #:

Obrigado, ficou um pouco mais claro, mas não tudo. Entendo corretamente que, se depois de criar um objeto de tela, eu simplesmente excluir o objeto do gráfico usando ObjectDelete(), a matriz de pixels vinculada a esse objeto permanecerá intocada e.... Quando crio um novo objeto de tela com um nome diferente novamente, uma nova matriz de pixels é criada na memória e, portanto, teoricamente, é possível preencher toda a memória?

É claro que os recursos sem proprietário se multiplicarão.

leon_17 #:

Ou ainda a matriz de pixels antiga é simplesmente vinculada novamente ao último objeto kanvas criado todas as vezes (porque é e somente com ela que todas as funções da instância usada da classe kanvas começam a funcionar)

Sua imaginação é excelente. Eu o invejo. Eu não teria pensado em uma coisa dessas. :))

Entretanto, se você salvar o nome de um recurso sem proprietário, poderá vinculá-lo novamente a um novo objeto de bitmap. Mas isso é do campo da esquizofrenia.

 
Nikolai Semko #:

No entanto, se você salvar o nome de um recurso sem proprietário, poderá vinculá-lo novamente a um novo objeto de bitmap. Mas isso é do campo da esquizofrenia.

Retiro minhas palavras. Acho que encontrei um caso em que isso pode ser útil.
 
Nikolai Semko #:
Retiro o que disse. Acho que encontrei um caso em que isso pode ser útil.

Obrigado, eu só queria entender o que acontece na memória se você usar ObjectDelete () em vez de Destroy (). E percebi que, nesse caso, os recursos gráficos (matrizes de pixels sem dono e qualquer outra coisa) serão multiplicados se um novo nome for gerado a cada vez para um novo objeto de tela.

E se eu usar ObjectDelete(), mas depois criar um objeto canvas com o mesmo nome, a matriz de pixels será antiga ou ainda será nova?

p.s. as perguntas provavelmente são estúpidas, mas preciso delas para entender o mecanismo do canvas


.

 
leon_17 #:

Obrigado, eu só queria entender o que acontece na memória se você usar ObjectDelete () em vez de Destroy (). E percebi que os recursos gráficos (matrizes de pixels sem dono e outras coisas) se multiplicarão se um novo nome for gerado para um novo objeto de tela a cada vez.

É fácil verificar isso escrevendo um script simples
 
Nikolai Semko #:
É fácil verificar isso escrevendo um script simples.

Você pode me dizer como?

 
leon_17 #:

Você pode me dizer como?

assim:

#define protected public
#include <Canvas\Canvas.mqh>
#undef protected

void OnStart() {
   while(!IsStopped()) {
      int Width =(ushort)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);  // получаем Ширину окна
      int Height=(ushort)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); // получаем Высоту окна
      CCanvas canvas;
      if(!canvas.CreateBitmapLabel("MyCanva"+string(rand()),0,0,Width,Height,COLOR_FORMAT_ARGB_NORMALIZE)) {
         Print("Error creating canvas: ",GetLastError());
      }
      canvas.FillRectangle(rand()%Width/2,rand()%Height/2,Width/2+rand()%Width/2,Height/2+rand()%Height/2,ARGB(128,rand()%255,rand()%255,rand()%255));
      canvas.Update();
      Comment("Задействовано памяти: - " + string(TerminalInfoInteger(TERMINAL_MEMORY_USED))+ " Mb");
      Sleep(500);
      ObjectDelete(canvas.m_chart_id,canvas.m_objname);
   }
}

e veja o comentário:

!!! depois de executar esse script, não se esqueça de recarregar o terminal para liberar memória para recursos órfãos.


 
Nikolai Semko #:

assim:

e veja o comentário:

!!! depois de executar esse script, não se esqueça de recarregar o terminal para liberar memória para recursos órfãos.


Muito obrigado por sua ajuda! Nunca trabalhei com a memória dessa forma antes, vou testá-la.
Obrigado pela dica de que os recursos órfãos são excluídos ao recarregar o terminal! Muitas dessas coisas ainda não são óbvias para mim.

p.s. tudo nesse exemplo é perfeito! Há algo para ver, algo para pensar e uma oportunidade para experimentar... O código é curto.

 
Se o kanvas for usado em um Expert Advisor, é necessário executar Destroy() ao remover o Expert Advisor do gráfico e fechar o terminal? Também não sei como verificar isso. Refiro-me a uma tela de trabalho com um objeto fixo. Nesse caso, a diferença de memória está dentro do erro (se você executar e não executar Destroy().
 
leon_17 remover o Expert Advisor do gráfico e fechar o terminal? Também não sei como verificar isso. Refiro-me a uma tela de trabalho com um objeto fixo. Nesse caso, a diferença de memória está dentro do erro (se você executar e não executar Destroy().

Você não precisa fazer isso. No destrutor do Canvas, ele é executado automaticamente:

                    ~iCanvas() { Destroy(); ChartRedraw();};