Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 92

 
Slava :
Bilgisayarın yerel saatinin, zamanı mikrosaniye cinsinden ölçmek için kullanılan GetMicrosecondsCount'a yapılan iki çağrı arasında değişmiş olma olasılığı nedir?

Sıfır değil.

 
TheXpert :
Çok yapıcı konuşma

Sonsuza kadar beş atıcıyı daha kaldıracağız ve hepsi bu.

Acele eden, WinAPI işlevlerinin gerçekliğini bir hata olarak adlandırmaya çalışan ve bizi suçlayanlara artık tahammülümüz yok. Belli ki daha fazla yapı olacak.

 
fxsaber :

Sıfır değil.

Ve istemci/sunucu bilgi alışverişi için milisaniye cinsinden zaman kaybı olasılığı nedir? Muhtemelen yerel saatte bir değişiklik olasılığından daha fazla.

 
Renat Fatkhullin'in fotoğrafı.

Sonsuza kadar beş atıcıyı daha kaldıracağız ve hepsi bu.

Acele eden, gerçekliğe böcek deyip bizi suçlayanlara artık tahammülümüz yok. Belli ki daha fazla yapı olacak.

konunun biraz sağında, OnTimer()'a doğru)))

Nerede okuduğumu hatırlamıyorum, orada MQ temsilcisi ( kim çok kaşınıyor ) sistemi 1ms gecikmeye transfer etmenin mümkün olduğunu yazdı ve sonra EventSetMillisecondTimer (...) kullanılıyormuş gibi görünüyor, daha sonra OnTimer () ayrıca 16ms değil, yaklaşık 1 ms'lik bir hatayla çalışacaktır.

Doğru anlarsam, OnTimer() sadece sistem gecikmesiyle çalışır, değil mi?


not. dün servis masasına bir istek gönderdi İşlenmedi , Başlatıldı: 2018.07.30 12:52 , # 2117844 , işlenmesine yardımcı olabilir misiniz, yoksa dünden askıda kalıyor))
 

OnTimer , GetTickCount WinAPI işlevi aracılığıyla kontrol edilen sistem WinAPI zamanlayıcısının hatasıyla çalışır. Bu, ölçülen süreç üzerinde minimum etkiye sahip olan, zamanı ölçmenin çok hızlı ve ucuz bir yoludur. Yani tüketimi ile nihai sonucu büyük ölçüde bozmaz.

Bu zamanlayıcının doğruluğu tüm işletim sistemi için artırılabilir, ancak bunun için hem CPU tüketimindeki artışta hem de birçok programın başlamasından kaynaklanan rastgele ve kitle kaynaklı etkilerde ödeme yapmanız gerekecektir:

  • zamanı doğru ölçmek
  • fişlerde daha az zaman harcamak
  • normal hatalar için çalışan bazı zaman aşımları açıkça yanlış davranışa dönüşür
  • ve bir dizi daha harika aksaklık

Windows sistem zamanlayıcı sorunu 20 yıldan eski. Ancak eski zamanlayıcının davranışını ve doğruluğunu değiştirmek tehlikelidir.

Bu nedenle, uzun zamandan beri yeni, daha doğru ölçüm yöntemleri tanıtılmıştır. Ancak bunlar kaynak yoğundur ve bunları eski zamanlayıcının yerine tam bir yedek olarak kullanmak akıllıca değildir.

GetMicrosecondCount kullanılarak uygulanan yüksek hassasiyetli bir zamanlayıcımız var. GetTickCount'tan daha pahalı olduğu bilinerek ve bilinçli kullanılmalıdır. Ek olarak, kesin ölçümlerde GetMicrosecondCount'a yapılan aramaların maliyeti açıkça dikkate alınmalıdır.

Zamanlayıcıyı kötüye kullanmak ve kendinizi ve başkalarını aldatmak için ölçütü temiz tutmamak çok kolaydır.

 
Renat Fatkhullin'in fotoğrafı.

Acele eden, WinAPI işlevlerinin gerçekliğini bir hata olarak adlandırmaya çalışan ve bizi suçlayanlara artık tahammülümüz yok. Belli ki daha fazla yapı olacak.

GetMicrosecondsCount'un bilgisayarın yerel saatine bağlı olduğunu ve değiştirildiğinde yeterince çalışmayabileceğini yardıma yazabilirsiniz. Ve GetTickCount bağımlı değildir.

mikrosaniye ölçümü işi de sorun göz önüne alındığında biraz hantal da olsa çözülebilir. ve bizim seviyemizde ve sizin seviyenizde çözülebilir. görünüşe göre bizimkilere karar vermek zorunda kalacak.

neden bir şeyi yasaklasın?

 
Renat Fatkhullin'in fotoğrafı.

OnTimer , GetTickCount WinAPI işlevi aracılığıyla kontrol edilen sistem WinAPI zamanlayıcısının hatasıyla çalışır. Bu, ölçülen süreç üzerinde minimum etkiye sahip olan, zamanı ölçmenin çok hızlı ve ucuz bir yoludur. Yani tüketimi ile nihai sonucu büyük ölçüde bozmaz.

Bu zamanlayıcının doğruluğu tüm işletim sistemi için artırılabilir, ancak bunun için hem CPU tüketimindeki artışta hem de birçok programın başlamasından kaynaklanan rastgele ve kitle kaynaklı etkilerde ödeme yapmanız gerekecektir:

  • zamanı doğru ölçmek
  • fişlerde daha az zaman harcamak
  • normal zaman aşımları için çalışan bazı zaman aşımları, açıkça yanlış davranışa dönüşür
  • ve bir dizi daha harika aksaklık

Windows sistem zamanlayıcı sorunu 20 yıldan eski. Ancak eski zamanlayıcının davranışını ve doğruluğunu değiştirmek tehlikelidir.

Bu nedenle, uzun zamandan beri yeni, daha doğru ölçüm yöntemleri tanıtılmıştır. Ancak bunlar kaynak yoğundur ve bunları eski zamanlayıcının yerine tam bir yedek olarak kullanmak akıllıca değildir.

GetMicrosecondsCount kullanılarak uygulanan yüksek hassasiyetli bir zamanlayıcımız var. GetTickCount'tan daha pahalı olduğu bilinerek ve bilinçli kullanılmalıdır. Ek olarak, kesin ölçümler durumunda GetMicrosecondsCount'a yapılan çağrıların maliyeti açıkça dikkate alınmalıdır.

Zamanlayıcıyı kötüye kullanmak ve kendinizi ve başkalarını aldatmak için ölçütü temiz tutmamak çok kolaydır.

ATP, MQ temsilcisinin sistem zamanlayıcısının zamanını azaltmak hakkında yazmasından sonra düşündüğüm şey buydu))

bu yüzden bu yönde hiçbir şeyi değiştirmeye gerek olmadığını destekliyorum

Bu arada C#'daki gibi yansıma yönünde ya da en azından boost'ta olduğu gibi bir gelişme var mı bilmek isterim. örneğin, serileştirme/seri hale getirme, uygulanması daha uygun olacaktır

 
TheXpert :

GetMicrosecondsCount'un bilgisayarın yerel saatine bağlı olduğunu ve değiştirildiğinde yeterince çalışmayabileceğini yardıma yazabilirsiniz. Ve GetTickCount bağımlı değildir.

Yardımda şöyle yazıyor: GetMicrosecondCount() işlevi, MQL5 programının başlangıcından bu yana geçen mikrosaniye sayısını döndürür .

Yani benim tarafımdan açıkça söylendi: zaman aralıklarını ölçmek için.

mikrosaniye ölçümü işi de sorun göz önüne alındığında biraz hantal da olsa çözülebilir. ve bizim seviyemizde ve sizin seviyenizde çözülebilir. görünüşe göre bizimkilere karar vermek zorunda kalacak.

neden bir şeyi yasaklasın?

yasaklamak lazım.

İlk olarak, mikrosaniye zamanlayıcının zamanlama ile ilgili bir sorunu yoktur. İkincisi, bazıları için, atmak için bir neden bulmak ve sonra onu sonuna kadar tutmak gerçekten kaşınıyor.

Yine kurallar değişti.

Daha fazla hakaret veya "yapmalısın" kabul edilmeyecektir. Haber vermeden temizleyeceğiz.

 
Renat Fatkhullin'in fotoğrafı.

Yardımda şöyle yazıyor: GetMicrosecondCount() işlevi, MQL5 programının başlangıcından bu yana geçen mikrosaniye sayısını döndürür.

GetTickCount işlevi için şöyle yazılmıştır:

GetTickCount() işlevi, sistem başladığından beri geçen milisaniye sayısını döndürür.

İfadeler neredeyse aynıdır, ancak bir işlev yerel saate bağlıdır, diğeri değildir. nasıl anlayacağız?

 
TheXpert :

GetTickCount işlevi için şöyle yazılmıştır:

İfadeler neredeyse aynıdır, ancak bir işlev yerel saate bağlıdır, diğeri değildir. nasıl anlayacağız?

WinAPI böyledir.

Size "gerekir" ifadesinin açık veya örtük bir biçimde kullanımını hatırlatırım. "Lütfen dikkate alın" yerine "meta alıntılar" kullanımı artık kabul edilemez.