MQL'de asenkron ve çok iş parçacıklı programlama - sayfa 24

 
Roman :

Programcı olmak için çalışmadım, her şeyi kendim çalışırım, bu yüzden beni sıkmayın ))

Ben de. Farklı bir mesleğim var. Programlama sadece bir araçtır, çekiç gibi.)

MKL için bir DLL oluşturma - kesinlikle standart bir DLL vardır, hiçbir özel özellik yoktur. Gerisi saf C++ veya isterseniz saf C#.

C++ veya Sharpe öğretmek benim gücümde değil, ancak her düzeyde tonlarca literatür var.

MKL'de basit bir DLL oluşturma hakkında bir makale var, bilgilendiriciliği hakkında bir şey söyleyemem. Evet ve istek üzerine Google yardım edecek - DLL'nin C ++ oluşturulması.

Bu arada, giriş noktası vb hakkında. Visual Studio'da bir DLL projesi oluşturulur ve ihtiyacınız olan her şey DLL tarafından oluşturulur, sadece elinizle dokunmayın.) Peki, etkileşim fonksiyonları, iş parçacıkları vb. .sadece kendin misin? Bu C ++, DLL ile ilişkili böyle bir özellik yok.

Tehdit Bir şeyi öğrenmenin en iyi yolu, belirli bir sorunu çözmektir. Bu benim fikrim bile değil.)

 
Yuriy Asaulenko :

Ben de. Farklı bir mesleğim var. Programlama sadece bir araçtır, çekiç gibi.)

MKL için bir DLL oluşturma - kesinlikle standart bir DLL vardır, hiçbir özel özellik yoktur. Gerisi saf C++ veya isterseniz saf C#.

C++ veya Sharpe öğretmek benim gücümde değil, ancak her düzeyde tonlarca literatür var.

MKL'de basit bir DLL oluşturma hakkında bir makale var, bilgilendiriciliği hakkında bir şey söyleyemem. Evet ve istek üzerine Google yardım edecek - Bir DLL'nin C ++ oluşturulması.

Bu arada, giriş noktası vb. hakkında. Visual Studio'da bir DLL projesi oluşturulur ve ihtiyacınız olan her şey DLL'nin kendisi tarafından oluşturulur, sadece elinizle dokunmayın.) Peki, etkileşim işlevleri, iş parçacıkları vb. .sadece kendin misin? Bu C ++, DLL ile ilişkili böyle bir özellik yok.

Evet, boş bir giriş noktasıyla dll'leri kendim yazabilirim))
Ancak giriş noktasıyla ilgili bilgiler hiçbir yerde bulunamıyor, sadece teneke, ne Google ne de benzer literatür veriyor ((
Tam olarak giriş noktasıyla ilgili bir sorunum var, etkileşim işlevlerini, başlatmayı, bellek ayırmayı , iş parçacıklarını, başlatmayı kaldırmayı vb. nasıl yazıyorsunuz?
Anahtardaki tüm bunların giriş noktasında uygulandığını biliyorum ve hepsi bu, bir çıkmaz))
Ve çalışmak için ne arayacağımı bile bilmiyorum.

 
Roman :

Evet, boş bir giriş noktasıyla dll'leri kendim yazabilirim))
Ancak giriş noktasıyla ilgili bilgiler hiçbir yerde bulunamıyor, sadece teneke, ne Google ne de benzer literatür veriyor ((
Tam olarak giriş noktasıyla ilgili bir sorunum var, etkileşim işlevlerini, başlatmayı, bellek ayırmayı , iş parçacıklarını, başlatmayı kaldırmayı vb. nasıl yazıyorsunuz?
Anahtardaki tüm bunların giriş noktasında uygulandığını biliyorum ve hepsi bu, bir çıkmaz))
Ve çalışmak için ne arayacağımı bile bilmiyorum.

Giriş noktası hakkında bir şey bildiğimi mi ima ediyorsun? Bu bir kraliyet meselesi değildir.) DLL'de bunu belirleyen tek bir benzersiz fonksiyon vardır.

 // dllmain.cpp: определяет точку входа для приложения DLL.
#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                                         )
{
         switch (ul_reason_for_call)
        {
         case DLL_PROCESS_ATTACH:
         case DLL_THREAD_ATTACH:
         case DLL_THREAD_DETACH:
         case DLL_PROCESS_DETACH:
                 break ;
        }
         return TRUE;
}

Bunu anlamana gerek yok.) İleride çoğu durumda DLL yazarken ve çalıştırırken bunu kullanmaya gerek kalmıyor. Ana şey, ellerinizle dokunmamaktır.)

 
Yuriy Asaulenko :

Giriş noktası hakkında bir şey bildiğimi mi ima ediyorsun? Bu bir kraliyet meselesi değildir.) DLL'de bunu belirleyen tek bir benzersiz fonksiyon vardır.

Bunu anlamana gerek yok.) İleride çoğu durumda DLL yazarken ve çalıştırırken bunu kullanmaya gerek kalmıyor. Ana şey, ellerinizle dokunmamaktır.)

Hayır, sadece anlamanız gerekiyor, eylemlerin sırasını kendiniz yazdınız, bu yüzden bunu iyi bildiğinizi düşündüm.
Bu giriş noktasında, işlevleri başlatmak, bellek ayırmak , bir iş parçacığı oluşturmak, başlatmayı kaldırmak vb. için tüm eylemler gerçekleştirilir.
En azından bu konuda ne okumalı?

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

MQL'de asenkron ve çok iş parçacıklı programlama

Yuriy Asaulenko , 2019.07.27 21:25

DLL'de bir iş parçacığı oluşturup ona veri iletirsiniz, iş parçacığını ayırır ve unutursunuz - görevini kendi başına tamamlayacaktır.
DLL'deki bir iş parçacığı ayrıldığında, terminal iş parçacığı serbest bırakılır. Tüm süreç, inanıyorum ki, bir milisaniyeden daha az sürüyor.
İş parçacığının bağlantısını kesmeden bile, veritabanına yazma işleminin 4-5 ms olduğuna karar verdim. Terminalden gelen asenkron bir çağrıya üzülmemek için 60 tik/sn yeterli.


 
Roman :

Hayır, sadece anlamanız gerekiyor, eylemlerin sırasını kendiniz yazdınız, bu yüzden bunu iyi bildiğinizi düşündüm.
En azından bu konuda ne okumalı?

Bunu anlamanıza, değiştirmenize vs. gerek yok. VS'de bir DLL projesi oluşturun , DllMain() kendi kendine oluşturulur. Tüm Windows uygulamaları bunu otomatik olarak destekler.

Göreviniz, işlevin dışa aktarımını ve bunların dışında ihtiyacınız olan herhangi bir şeyi en yaygın C ++ kodunu yazmaktır. DLL'niz hazır ve çalışacak.

OOP, öncelikle nesneleri iç yapılarını bilmeden kullanmak için yaratılmıştır, böylece her şeyi ve her şeyi incelemeye değil, kendi probleminizi çözmeye odaklanabilirsiniz. Bir araba kullanıyoruz ve elektronik ve motor tasarımı hakkında hiçbir fikrimiz olmayabilir. DLL durumunda, her şey benzer.

Ve daha önce bahsettiğim DllMain () işlevi, görevlerini yerine getiren oldukça karmaşık bir DLL'nin gerçek bir projesinden alındı.

 
Yuriy Asaulenko :

Bunu anlamanıza, değiştirmenize vs. gerek yok. VS'de bir DLL projesi oluşturun, DllMain() kendi kendine oluşturulur. Tüm Windows uygulamaları bunu otomatik olarak destekler.

Göreviniz, işlevin dışa aktarımını ve bunların dışında ihtiyacınız olan herhangi bir şeyi en yaygın C ++ kodunu yazmaktır. DLL'niz hazır ve çalışacak.

OOP, öncelikle nesneleri iç yapıları hakkında fikir sahibi olmadan kullanmak için yaratılmıştır. Bir araba kullanıyoruz ve elektronik ve motor tasarımı hakkında hiçbir fikrimiz olmayabilir. DLL durumunda, her şey benzer.

Bu anlaşılabilir bir durumdur, işlevlerin kendilerinin yazılması bir sorun değildir, tüm anlaşmalarda 1. ve 2. maddelerde olduğu gibi bununla ilgili bir sorun yoktur.
Amaçağrılan bir işlev için nasıl bir iş parçacığı oluşturacağımı varsayalım,
DLL_THREAD_ATTACH durumunda, C++ işlevleriyle biraz şamanizm yapmanız gerekir.
bellek ayırın, bu işlev için bir iş parçacığı oluşturun,
ve sonra hepsini DLL_THREAD_DETACH içinde temizleyin, yani her şey göründüğü kadar basit değil.

Bunu neden söylüyorum, çünkü görevlerin asenkron olarak gerçekleştirildiği bir asenkron kütüphane denedim,
Bu kütüphaneden bir dll yapmak istedim ama nedense her zaman program tamamlamanın sonunda yani Expert Advisor'ı grafikten çıkarırken terminalim çöküyor.
Bu nedenle giriş çıkış noktaları ile şamanizasyon yapmanız gerekiyor.

 
Roman :

Bu nedenle giriş çıkış noktaları ile şamanizasyon yapmanız gerekiyor.

...yani, Expert Advisor'ı tablodan kaldırdığımda terminalim çöküyor.

Gerekli değil. Bu giriş noktasının hatası değil. Yanlış bir şey yapıyorsun.

Sınıflar, ipler, vb. - tüm bunlar mükemmel bir şekilde yaratılmıştır ve herhangi bir şamanizm olmadan bir DLL'de çalışır. Ancak, çıkış yaptığınızda DLL'deki tüm SİZİN işlemleriniz tamamlanmış ve nesneler yok edilmiş olmalıdır. Bu, bir DLL hata ayıklarken olur.) C/C++'da, tüm kontrol programın değil programcının sorumluluğundadır.

ZY Ben böyle yapıyorum. Uygulamadan bir DLL işlevi çağırıyorum, diyelim

 bool job = true ;

void Close() 
{
	job = false ;
	delete Obj1;
	delete Obj2;
	......
}
job=false ile, tüm işlemler sonlandırılır, silme ile, cat için tahsis edilen tüm nesneler silinir, vb.
 
Yuriy Asaulenko :

Ancak, çıkış yaptığınızda DLL'deki tüm SİZİN işlemleriniz tamamlanmış olmalıdır.

Büyük olasılıkla sorun bu, bunu bilmiyordum, bağlantıyı keserken dll'nin süreçleri sonlandırdığını düşündüm.
Çıkmadan önce tüm işlemleri nasıl sonlandıracağımı düşüneceğim, bahşiş için teşekkürler.
Ancak bundan yalnızca DLL_PROCESS_DETACH sorumludur ve bu durumda tüm işlemleri zorla kapatmanız gerekir.

 
Roman :

Ancak bundan yalnızca DLL_PROCESS_DETACH sorumludur ve bu durumda tüm işlemleri zorla kapatmanız gerekir.

DLL'nin uygulamayla bağlantısını kesmekten sorumludur. DllMain()'in sorumluluğu standart iletişim protokolünü desteklemektir. DLL_PROCESS_DETACH büsbütün başka bir şeyle ilgili.) Sizin süreçlerinizle hiçbir şekilde ilgilenmiyor, bu sadece sizin işiniz.

MT'nin bir sonlandırma işlevi vardır. onClose() görünüyor. İşte tüm işlemler ve uygun DLL işlevini çağırarak tamamlayın.

 
Yuriy Asaulenko :

DLL'nin uygulamayla bağlantısını kesmekten sorumludur. Süreçleriniz onu ilgilendirmiyor, bu sadece sizin işiniz.

Tamam deneyeceğim. İncelikleri açıklamak için zaman ayırdığınız için teşekkür ederiz, teşekkür ederim.