Tuval harika! - sayfa 90

 
Nikolai Semko #:

Tuval, bir piksel dizisinin bağlı olduğu bir nesnedir. Kaynak, bu piksel dizisini bağlamaktan sorumludur (bkz. bool CCanvas::Create())
Bir tuvali her zaman silmek ve yeniden oluşturmak kötü bir uygulamadır.
Bir tuvali ihtiyaç duyulduğunda oluşturmak ve artık ihtiyaç duyulmadığında, örneğin programın sonunda silmek iyi bir uygulamadır.

Bir tuval nesnesi oluşturduktan sonra onu temizleyebilir, her karede piksel dizisinin üzerine yazabilir, tuvali yeniden boyutlandırabilir ve istediğiniz yere taşıyabilirsiniz.

Teşekkürler, biraz daha netleşti ama hepsi değil. Bir canvas nesnesi oluşturduktan sonra, ObjectDelete() kullanarak nesneyi grafikten silersem, bu nesneye bağlı piksel dizisine dokunulmadan kaldığını ve ... doğru anlıyor muyum? Farklı bir adla tekrar yeni bir canvas nesnesi oluşturduğumda, bellekte yeni bir piksel dizisi oluşturulur ve böylece teorik olarak tüm belleği doldurmak mümkün olur mu?

Yoksa eski piksel dizisi her seferinde son oluşturulan canvas nesnesine yeniden mi bağlanıyor (çünkü canvas sınıfının kullanılan örneğinin tüm fonksiyonları sadece onunla çalışmaya başlıyor)?

 
leon_17 #:

Teşekkürler, biraz daha netleşti ama hepsi değil. Bir canvas nesnesi oluşturduktan sonra ObjectDelete() kullanarak nesneyi grafikten silersem, bu nesneye bağlı piksel dizisinin dokunulmadan kaldığını ve.... doğru anlıyor muyum? Farklı bir adla tekrar yeni bir canvas nesnesi oluşturduğumda, bellekte yeni bir piksel dizisi oluşturulur ve böylece teorik olarak tüm belleği doldurmak mümkün olur mu?

Tabii ki, sahipsiz kaynaklar çoğalacaktır.

leon_17 #:

Ya da eski piksel dizisi her seferinde son oluşturulan kanvas nesnesine yeniden bağlanır (çünkü kanvas sınıfının kullanılan örneğinin tüm işlevleri çalışmaya başlar)

Hayal gücünüz muhteşem. Sizi kıskanıyorum. Böyle bir şey aklıma gelmezdi. :))

Ancak, sahipsiz bir kaynağın adını kaydederseniz, onu yeni bir bitmap nesnesine yeniden bağlayabilirsiniz. Ama bu şizofreni alanından.

 
Nikolai Semko #:

Ancak, sahipsiz bir kaynağın adını kaydederseniz, onu yeni bir bitmap nesnesine yeniden bağlayabilirsiniz. Ama bu şizofreni alanından.

Sözlerimi geri alıyorum. Sanırım böyle bir şeyin yararlı olabileceği bir durum buldum.
 
Nikolai Semko #:
Sözümü geri alıyorum. Sanırım bunun yararlı olabileceği bir durum buldum.

Teşekkürler, sadece Destroy () yerine ObjectDelete() kullanırsanız bellekte ne olacağını anlamak istedim. Ve böyle bir durumda grafik kaynaklarının (sahipsiz piksel dizileri ve diğer her şey) yeni bir tuval nesnesi için her seferinde yeni bir ad oluşturulursa çoğalacağını fark ettim.

Ve eğerObjectDelete() kullanırsam ,ama sonra aynı isimde bir canvas nesnesi yaratırsam, piksel dizisi eski mi yoksa hala yeni mi olacak?

p.s. sorular muhtemelen aptalca, ama canvas mekanizmasını anlamak için buna ihtiyacım
var

.

 
leon_17 #:

Teşekkürler, sadece Destroy () yerine ObjectDelete() kullanırsanız bellekte ne olacağını anlamak istedim. Ve her seferinde yeni bir canvas nesnesi için yeni bir isim oluşturulursa grafik kaynaklarının (sahipsiz piksel dizileri ve başka bir şey) çoğalacağını fark ettim.

Basit bir kod yazarak bunu kontrol etmek kolaydır
 
Nikolai Semko #:
Basit bir komut dosyası yazarak kontrol etmek kolaydır.

Nasıl yapacağımı söyleyebilir misiniz?

 
leon_17 #:

Nasıl olduğunu söyleyebilir misiniz?

Bunun gibi:

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

ve yoruma bakın:

!!! bu betiği çalıştırdıktan sonra, yetim kaynaklar için bellek boşaltmak üzere terminali yeniden yüklemeyi unutmayın.


 
Nikolai Semko #:

Bunun gibi:

ve yoruma bak:

!!! Bu betiği çalıştırdıktan sonra, yetim kaynaklar için bellek boşaltmak üzere terminali yeniden yüklemeyi unutmayın.


Yardımınız için çok teşekkür ederim! Daha önce bellekle bu şekilde çalışmamıştım, test edeceğim.
Terminal yeniden yüklenirken yetim kaynakların silindiğine dair ipucu için teşekkürler! Bu tür birçok şey henüz benim için açık değil.

p.s. bu örnekteki her şey mükemmel! Bakılacak bir şey, düşünülecek bir şey ve deneme fırsatı var... Kod kısa.

 
Bana daha fazlasını söyleyebilir misiniz, eğer kanvas bir Uzman Danışman'da kullanılıyorsa, Uzman Danışmanı grafikten kaldırırken ve terminali kapatırken Destroy() işlevini yürütmek gerekli midir? Bunu nasıl kontrol edeceğimi de bilmiyorum. Sabit bir nesneye sahip çalışan bir tuvali kastediyorum. Orada bellekteki fark hatanın içindedir ( Destroy() işlemini yaparsanız ve yapmazsanız.
 
leon_17 Uzman Danışmanı grafikten kaldırırken ve terminali kapatırken Destroy() işlevini yürütmek gerekli midir? Bunu nasıl kontrol edeceğimi de bilmiyorum. Sabit bir nesneye sahip çalışan bir tuvali kastediyorum. Orada bellekteki fark hatanın içindedir ( Destroy() gerçekleştirirseniz ve gerçekleştirmezseniz.

Buna gerek yok. Canvas destructor'ında otomatik olarak çalıştırılır:

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