キャンバスがカッコいい! - ページ 90

 
Nikolai Semko #:

キャンバスは、ピクセルの配列がバインドされたオブジェクトです。このピクセルの配列をバインドするのはリソースです(bool CCanvas::Create()を参照)
キャンバスを常に削除して再作成するのは悪い習慣です。
キャンバスは必要なときに作成し、不要になったら削除するのが良い習慣です。例えば、プログラムの終了時などです。

一度キャンバスオブジェクトを作成すれば、それをクリーンアップしたり、毎フレームピクセル配列を上書きしたり、キャンバスのサイズを変更したり、好きな場所に移動したりすることができます。

ありがとうございます、少しわかりやすくなりました。キャンバス・オブジェクトを作成した後、ObjectDelete() を使ってそのオブジェクトをチャートから削除すると、そのオブジェクトにバインドされたピクセル配列はそのまま残り、 ...という理解で合っていますか?再度別の名前で新しいキャンバスオブジェクトを作成すると、メモリ上に新しいピクセル配列が作成されるので、理論的にはメモリ全体を埋めることが可能なのでしょうか?

それとも、古いピクセル配列は、最後に作成されたキャンバス・オブジェクトに毎回バインドし直されるだけなのでしょうか?

 
leon_17 #:

ありがとうございます。キャンバス・オブジェクトを作成した後、ObjectDelete() を使ってそのオブジェクトをチャートから削除すると、そのオブジェクトにバインドされたピクセル配列はそのまま残り、......というのが正しい理解でしょうか?再度別の名前で新しいキャンバス・オブジェクトを作成すると、新しいピクセル配列がメモリ上に作成されるため、理論的にはすべてのメモリを一杯にすることが可能なのでしょうか?

もちろん、オーナーレスリソースは増殖します。

leon_17#

あるいは、古いピクセル配列は、毎回、最後に作成された kanvas オブジェクトに再バインドされます。

あなたの想像力は素晴らしい。うらやましい。私ならそんなことは思いつかない。:))

ただし、所有者のいないリソースの名前を保存しておけば、それを新しいビットマップオブジェクトに再バインドすることができる。しかし、これは統合失調症の分野の話である。

 
Nikolai Semko #:

However, if you save the name of an ownerless resource, you can re-bind it to a new bitmap object.しかし、これは統合失調症の分野の話だ。

前言撤回。そんなことが役に立つケースを見つけたようだ。
 
Nikolai Semko #:
撤回するよ。これが役に立つケースを見つけたと思う。

Destroy ()の 代わりにObjectDelete () を使用した場合、メモリ上で何が起こるのかを理解したかっただけです。そして、このような場合、新しい canvas オブジェクトに対して毎回新しい名前が生成されると、グラフィックリソース(所有者のいないピクセル配列やその他のもの)が増殖することに気づきました。

また、ObjectDelete() 使用した 後で、同じ名前の canvas オブジェクトを作成した場合、ピクセル配列は古いままなのでしょうか、それとも新しいままなのでしょうか?

p.s. 質問はおそらく愚かなものだと思いますが、canvas


のメカニズムを理解するために必要な のです。

 
leon_17 #:

ありがとうございます。Destroy ()の 代わりにObjectDelete () を使用した場合、メモリ上で何が起こるのかを理解したかったのです。そして、新しいcanvasオブジェクトに対して毎回新しい名前が生成される場合、グラフィカル・リソース(所有者のいないピクセル配列やその他の何か)が増殖することに気づきました。

これを確認するには、簡単なスクリプトを書けばよい。
 
Nikolai Semko #:
簡単なスクリプトを書けばチェックできます。

方法を教えていただけますか?

 
leon_17 #:

どうすればいいか教えてくれる?

このように

#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);
   }
}

そしてコメントを見てください:

このスクリプトを実行した後、ターミナルをリロードして、オーファンリソースのためにメモリを解放することを忘れないでください。


 
Nikolai Semko #:

こんな感じだ:

そしてコメントを見てください:

このスクリプトを実行した後、端末をリロードして、オーファンリソースのためにメモリを解放することを忘れないでください。


ありがとうございました!
ターミナルをリロードするとオーファンリソースが削除されるというヒントをありがとう!このような多くのことは、私にはまだ明らかではありません。

p.s.この例はすべて完璧です!見るべきもの、考えるべきもの、実験する機会がある...。コードは短い。

 
Expert Advisor で kanvas を使用している場合、 Expert Advisor を チャートから削除して ターミナルを閉じるときに Destroy() を実行する必要がありますか?確認方法もわかりません。固定されたオブジェクトを持つキャンバスのことです。そこではメモリの差はエラーの範囲内です(Destroy() を実行する場合としない場合。
 
leon_17 Expert Advisor を チャートから削除して ターミナルを閉じるときに Destroy() を実行する必要がありますか?確認方法もわかりません。固定オブジェクトのキャンバスのことです。そこではメモリの差はエラーの範囲内(Destroy()実行する場合としない場合。

実行する必要はありません。キャンバスのデストラクタでは自動的に実行されます:

                    ~iCanvas() { Destroy(); ChartRedraw();};
理由: