Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Ayrıca her değişiklikte tamamen yeniden çizilen tam ekran bir tuvalim var, ancak 50 ms'den fazla sürmüyor....
En pahalı olanı metin çizmektir. Bu nedenle her seferinde TextOut kullanmamak için onları dizilerde saklıyorum. Çok daha hızlı oluyor.
Şimdi asıl zorluk kullanıcıya arayüz kontrolleri üzerinde programatik kontrol sağlamaktır.
Teknik olarak bu görev zor değildir, çünkü kullanıcı programı ve motorun simbiyotik birlikteliğinde, grafik çekirdek her iki tarafın algoritmaları tarafından global düzeyde görülebilir. Sorun, kullanıcının çekirdekle nasıl çalışacağını bilmemesidir. Eleman yönetimi ilkelerini bilmiyor ve anlamıyor. Bu nedenle, çekirdeğe erişebileceği ve değerleri değiştirebileceği tanıdık sarmalayıcılar - işlevler vermek gerekir.
Ancak bir nüans var. Fonksiyonların isimleri çok uzun. Sonuçta, etkileşimli bir öğenin her bir işlevsel sargısı, öğenin ve pencerenin adlarını içermelidir. Bu, isimler arasında yönlendirme için gereklidir. Aksi takdirde, kullanıcının kafası kolayca karışacak ve işlev sarmalayıcılarını anlamayacaktır. Ayrıca, isimler çakışabilir ve bu hiç de iyi değildir. Böylece ortaya çıkıyor - iki bileşenden isimler oluşturmanız gerekiyor: öğenin adı ve pencerenin adı. O zaman karışıklık olmaz, ancak sarmalayıcıların adları çok uzun olur. Özellikle de geçirilen parametreler tarafında. Ek olarak, intellisense aracılığıyla hızlı bir şekilde bulmak için işlevlere ön ekler eklemeniz gerekir. Bu, açılır örneğin verimli bir şekilde filtrelenmesini sağlar. Kullanışlı. AMA UZUN!
Sadece bu da değil. Sorun, geçirilen parametrelerdir. Seçim, ya öğelerin ve pencerelerin her ön ayarlı get/set-properties için sarmalayıcılar yazmak ya da her sarmalayıcının bir kullanıcı çağrısından gelen parametrelerin tam listesini kabul etmesidir. Bu son derece elverişsizdir. Ve en önemlisi, açıklaması zordur.
Bir çıkış yolu var ve çok basit. Ve işte bu: bir grup soyut özellik. Kullanıcının programı ve motor tarafından aynı anda görülebilen global değişkenler.
Nasıl çalışacak:
1. Tüm öğe ve pencere sarmalayıcıları merkezi fonksiyonu adresleyecek ve indekslerini iletecektir. Merkezi fonksiyon bunları çağrının hedef elemanını/penceresini belirlemek için kullanacaktır.
2. Bu çağrıdan sonra, kullanıcı seçilen soyut özellikler kümesini gerekli değerlere ayarlayacaktır.
3. Merkezi fonksiyonu çağırın ve c.word "Set "i iletin.
4. Central, soyut özelliklerin değerlerini global değişkenlerinden belirli eleman veya pencerenin hedef özelliklerine ayarlayacaktır.
5. Elemanı/pencereyi güncelleyecek ve soyut özellikleri sıfırlayacaktır.
İşte bu kadar.
Bence, aşağıdakileri sağlayacak basit ve etkili bir çözüm:
a) Sıkı tutarlılık gerektiren bir işleve parametre aktarmadan herhangi bir öğenin ve pencerenin özelliklerine kolay erişim. (Artı - geçirilen parametre sayısında sınırlama. Ve çağrı uzun ve okunamaz hale gelir).
c) Programın herhangi bir yerindedeğerler ayarlanırken/alınırken bir dizi öğe ve pencere özelliğinin serbest kombinasyonu.
Dezavantajlar gören varsa konuşsun. Yayınlanmadan önce bu konuyu koordine etmek güzel olurdu.
Nicholas, birden fazla GUI penceresinden bahsettiğimizi dikkate almakta fayda var. Son sürümde bunlardan 17 tane vardı ve her birinde yüzlerce öğe vardı. Ve her bir öğe karmaşıktır. Bir dizi parçadan oluşur. Her ayrıntı, tuvalin içinden geçmeniz gereken ve gerekli değerlerle doldurmak için doğru yerde bulunan bir bölümüdür.
Ortalama pencere sayısını 10 alırsak (Papkov'un 11 pencerelik bir arayüz sipariş ettiğini hatırlıyorum) ve her birinin bir dizi öğeye veya bir tabloya sahip olduğunu hayal edersek, tüm arayüzün tam olarak oluşturulmasının neden bu kadar zaman aldığı anlaşılır. Arayüzde simgeler, gölgeler, yüzey gradyanı, çeşitli çerçeveler olduğunu hatırlatmama izin verin.... o zaman toplamda TÜM arayüzün tamamen çizilmesi en az 500 ms sürecektir. Bu konuda yapabileceğiniz hiçbir şey yok.
Pencere sayısını azaltırsanız veya grafikleri basitleştirirseniz daha hızlı olabilir.
Yeniden çizme hakkında - neredeyse hiç saf ChartRedraw() çağrım yok. _ChartRedraw bayrağı her yerde kullanılır. Bu bayrak ayarlandığında, ChartRedraw() işlevi 25 ms sonra bir sonraki zamanlayıcı yinelemesinde çağrılır. Yani bir kez. Bu şekilde gereksiz yeniden çizimlerden kaçınıyorum. Sadece nadir durumlarda ChartRedraw() fonksiyonuna doğrudan çağrı yapıyorum .
Ayrıca tam ekran tuvali her değiştirdiğimde tamamen yeniden çiziliyor, ancak bu 50 ms'den uzun sürmüyor ...
En pahalı olanı metin çizmektir. Bu nedenle, her seferinde TextOut kullanmamak için bunları dizilerde saklıyorum. Çok daha hızlı oluyor.
Basit aritmetik burada işe yarıyor: 10 - 17 pencerenin alanlarının toplamı tam ekrandan çok daha büyük. Katılıyorum. Artı gölgeler, simgeler, çerçeveler oluşturmak için gerekli ikincil ek çizim....
Ve TextOut hakkında kontrol edip yazacağım. İlginç bir fikir.
Bir test gerçekleştirdim:
Demo proje 1.mqh dosyasına girdim ve tüm pencereleri OOI bayrağına ayarladım. (başlatma sırasında açılıyor).
Toplamda - farklı boyutlarda ve farklı içeriklerde 15 pencere. Kaydırma çubukları ve tabloları olan 2 pencere (böylece tuvalleri kısmen gizlenir ve aslında 2-3 kat daha uzundur. Tam uzunluk, kaydırma çubuğunun kaydırma çubuğuna oranına göre değerlendirilebilir). Toplam çizim alanı(minimum) 2000*1000 piksel. Ama bundan daha fazla olduğunu düşünüyorum. Toplam çizilen 1158 parça (çekirdek yazdırıldıktan sonra kontrol edildi). Tüm tuvallerin sıfırdan 1600 - 1900 ms arasında tam çizim süresi.
Yine çizilmesi gereken ayrıntıların miktarına dikkat edin. Gölgeler, simgeler, degradeler, çerçeveler, metinler.
Çizim süresi ekran görüntüsü üzerindedir:
Belirli pencereleri yalnızca açık olduklarında çizebilir miyim? Aynı anda düzinelerce pencerenin açık olması nadirdir. Buna hiç gerek yok.
Bu olan tek şey, inanın bana. Ben sadece tüm arayüz pencerelerinin aynı anda ilk çiziminden bahsediyorum. İlk çizim en çok zaman alan çizimdir. Ve bundan sonra, tüm görüntüler zaten kaydedilir ve gerekirse bellekten alınır. Tek bir çağrı ile birkaç milisaniye içinde tuvallerine eklenirler. Bu bir sorun değildir. Sadece ilk çizimin süresini sıkıştırmak istiyorsunuz.
Çizimi hızlandırmanın bir yolu olabilir. Pencere platformlarının alt tabanını kaldırın. Bunlar, elemanların bulunduğu ön tarafın arkasındaki büyük tuvallerdir. Onları kaldırırsanız, 2 kat daha hızlı olacaktır. Bunun hakkında düşünmem gerekecek.
Bahsettiğim tuval bu:
1. Elemanların bulunduğu ön taraf:
2. Pencerenin düğmelerinin (çarpı, simge durumuna küçültme), simgesinin ve ad metninin bulunduğu arka taraf. Ancak, pencerenin tamamı yeşil renktedir ve üzerinde zaman harcanmıştır. Ancak kullanıcı sadece çerçeveleri ve pencere başlığını görür. Bu yerde çizimin boşuna yapıldığı ortaya çıkıyor: