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

 
Koldun Zloy :

MT geliştirme şirketinin bir temsilcisinin size daha önce verdiği yanıtı tercüme ediyorum:

MQL'den akışlar oluşturamazsınız. WinAPI ile bile.

Bunu ancak kendi DLL'nizi yazarak yapabilirsiniz.

WinAPI ve standart dll'leri kullanır!

kernel32.dll
user32.dll

vb.

WinAPI işlevleriyle çok iş parçacıklı çalışma gerekiyordu, mql işlevleriyle değil
Ancak çok iş parçacıklı mql işlevleriyle çalışmanın imkansız olması, evet, üzücü.

 
Roman :

WinAPI ve standart dll'leri kullanır!

kernel32.dll _
user32.dll

hmm, bence, tam tersi: WinAPI, kernel32.dll , user32.dll dinamik kitaplıkları olarak uygulanır...

bence, "Merhaba Word!" metniyle normal bir Windows penceresi saf C ++ ile yazmayı hiç denemediniz. - "arabalı araba" ağındaki örnekler, ilk "Merhaba Word!" - çoğu kendiliğinden düzelir ;)

 
Igor Makanu :

hmm, bence, tam tersi: WinAPI, kernel32.dll , user32.dll dinamik kitaplıkları olarak uygulanır...

bence, "Merhaba Word!" metniyle normal bir Windows penceresi saf C ++ ile yazmayı hiç denemediniz. - "arabalı araba" ağındaki örnekler, ilk "Merhaba Word!" - çoğu kendiliğinden düzelir ;)


Standart, bunların standart Windows dll'leri olduğu anlamına gelir, standart ise bunların statik olduğu anlamına gelmez .lib

Igor, yanlış bozkırdasın ...
Ve burada "Merhaba Kelime!" soru, bir dll'yi başlatmak ve ondan kendi iş parçacığında bir işlev çağırmakla ilgili olduğunda!

Örneğin:
Bir WinAPI işlevi vardır MessageBoxW();
İş parçacığınızda çağrılması gerekiyor.

Bunun için dll'nin kendisini ve dışa aktarılan işlevi başlatmak gerekiyor, bunun nasıl doğru bir şekilde yapılacağına bir örnek verin?

LoadLibraryW( "user32.dll" );
GetProccAddress(hMyDll, "MessageBoxW" );
FreeLibrary(hMyDll);
и т.д.

Ardından, başlatma işleminden sonra MessageBoxW()'ı çağırırız; CreateThread() kullanarak;
Fonksiyonu çalıştırdıktan sonra kaynağı serbest bırakıyoruz ve akışı kapatıyoruz.
Mql'de nasıl doğru bir şekilde yapılacağına dair bir örnek verin?

 
Şu anda çok iş parçacıklı bir sistem üzerinde çalışıyorum. Ancak MKL'de değil, standart C++'da. Oh, oraya kaç tane tırmık dağılmış.))
 
Roman :


Standart, bunların standart Windows dll'leri olduğu anlamına gelir, standart ise bunların statik olduğu anlamına gelmez .lib

Igor, yanlış bozkırdasın ...
Ve burada "Merhaba Kelime!" soru, bir dll'yi başlatmak ve ondan kendi iş parçacığında bir işlev çağırmakla ilgili olduğunda!

Örneğin:
Bir WinAPI işlevi vardır MessageBoxW();
İş parçacığınızda çağrılması gerekiyor.

Bunun için dll'nin kendisini ve dışa aktarılan işlevi başlatmak gerekiyor, bunun nasıl doğru bir şekilde yapılacağına bir örnek verin?

Daha sonra başlatma işleminden sonra MessageBoxW()'ı çağırırız; CreateThread() kullanarak;
Fonksiyonu çalıştırdıktan sonra kaynağı serbest bırakıyoruz ve akışı kapatıyoruz.
Mql'de nasıl doğru bir şekilde yapılacağına dair bir örnek verin?

bu yanlış bozkırdasın, cevaplandın - bir dll yaz (buraya bellek ayırman ve yeni bir iş parçacığı kaydetmen gerekiyor! - sonra çıkarken her şeyi temiz bir şekilde yok et!) ve MQL'den çağır

örneğin bellek ayırma ve işlem kaydınızda nerede? MessageBox'ı çağırmış olmanız - bu yalnızca MQL programının kaynaklarını sağladığı, ancak ayrı bir iş parçacığı oluşturmadığı anlamına gelir, kontrol etmek bile istemiyorum, ancak MessageBox'ı aradığınızda terminaliniz donmalı

 
Igor Makanu :

yanlış bozkırdasın, cevaplandın - dll yaz ve MQL'den ara

örneğin bellek ayırma ve işlem kaydınızda nerede? MessageBox'ı çağırmış olmanız - bu yalnızca MQL programının kaynaklarını sağladığı, ancak ayrı bir iş parçacığı oluşturmadığı anlamına gelir, kontrol etmek bile istemiyorum, ancak MessageBox'ı aradığınızda terminaliniz donmalı

İgor, neyle ilgili olduğunu anlamak için örnek olarak dll başlatma fonksiyonlarını verdim ama mql'de nasıl doğru yapacağımı bilmiyorum, saf C++ yanıltıcı olabilir.
Evet ve mql dilinin özelliği beyinleri toz haline getirebilir. Bu yüzden yardım için foruma döndüm, Google'a değil.
WinAPI zaten bir dll üzerinde kuruluysa ve çağrılan işlevler zaten örneğin user32.dll'de bulunuyorsa neden bir dll yazmalıyım?
Bu yüzden, mql'de nasıl doğru bir şekilde yapılacağına dair bu konuyu anlamak için bir konu oluşturdum ve siz bana bellek tahsisinin ve işlem kaydının nerede olduğunu söylüyorsunuz)).
Bunun mql'de nasıl yapıldığına dair doğru bir örnek göster?
Ya da beni iyi bir rehbere yönlendirin.

 
Roman :

İgor, neyle ilgili olduğunu anlamak için örnek olarak dll başlatma fonksiyonlarını verdim ama mql'de nasıl doğru yapacağımı bilmiyorum, saf C++ yanıltıcı olabilir.
Evet ve mql dilinin özelliği beyinleri toz haline getirebilir. Bu yüzden yardım için foruma döndüm, Google'a değil.
WinAPI zaten bir dll üzerinde kuruluysa ve çağrılan işlevler zaten örneğin user32.dll'de bulunuyorsa neden bir dll yazmalıyım?
Bu yüzden, mql'de nasıl doğru bir şekilde yapılacağına dair bu konuyu anlamak için bir konu oluşturdum ve bana bellek ayırma ve işlem kaydının nerede olduğunu söylüyorsunuz)).
Bunun mql'de nasıl yapıldığına dair doğru bir örnek göster?
Ya da beni iyi bir rehbere yönlendirin.

WinAPI kullanarak bile bir mql programından iş parçacığı oluşturmayın.

 
Roman :

İgor, neyle ilgili olduğunu anlamak için örnek olarak dll başlatma fonksiyonlarını verdim ama mql'de nasıl doğru yapacağımı bilmiyorum, saf C++ yanıltıcı olabilir.
Evet ve mql dilinin özelliği beyinleri toz haline getirebilir. Bu yüzden yardım için foruma döndüm, Google'a değil.
WinAPI zaten bir dll üzerinde kuruluysa ve çağrılan işlevler zaten örneğin user32.dll'de bulunuyorsa neden bir dll yazmalıyım?
Bu yüzden, mql'de nasıl doğru bir şekilde yapılacağına dair bu konuyu anlamak için bir konu oluşturdum ve siz bana bellek tahsisinin ve işlem kaydının nerede olduğunu söylüyorsunuz)).
Bunun mql'de nasıl yapıldığına dair doğru bir örnek göster?
Ya da beni iyi bir rehbere yönlendirin.

bir kez daha - bu MQL aracılığıyla yapılmaz, sorunu diğer taraftan - kuyruk tarafından çözersiniz. kafadan değil!

bir dll yazın - MQL'den arayın ve dll'ye veri iletin ve MQL programını (karmaşık hesaplamalar) durdurmanız gerekmiyorsa, dll'de yeni bir iş parçacığı oluşturun ve verileri bu iş parçacığında işleyin

dll nasıl yazılır - forumda arama yapın "dll" makaleleri 20 tam olarak olacak

kılavuz yok, ancak dll'yi ne yazacağınıza - bu kaynağa ve nasıl iş parçacığı oluşturulacağına vb.

 
Dmitry Fedoseev :

WinAPI kullanarak bile mql programından bir iş parçacığı oluşturmayın.

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

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

MetaQuotes Yazılım A.Ş. , 2019.07.24 16:31

MQL işlevleri bir DLL'den çağrılamaz .

Ancak, ortamlarında MQL5'ten bağımsız olarak çalışabilmeleri için DLL çağrıları yoluyla birden çok iş parçacığı başlatmak mümkündür .

Örneğin, veriler MQL'den hazırlandı, bir yere yerleştirildi veya bir DLL kitaplığına aktarıldı, bu da görevi birden çok iş parçacığında tamamlayacak ve sonucu ek bir işlev aracılığıyla döndürecek.


Windows API işlevlerine yapılan bir çağrı, bir dll'den gelen bir çağrıdır; bu, Windows API işlevleri için CreateThread() kullanarak iş parçacıkları oluşturabileceğiniz anlamına gelir ;
Hiç
şüphe yok ki CreateThread(); standart mql kitaplığına taşınır.

 
Roman :

Windows API işlevlerine yapılan bir çağrı, bir dll'den gelen bir çağrıdır; bu, Windows API işlevleri için CreateThread() kullanarak iş parçacıkları oluşturabileceğiniz anlamına gelir ;
Hiç
şüphe yok ki CreateThread(); standart mql kitaplığına taşınır.

kimse bir şey taşımadı, içerdiğinde gördüğünüz sadece fonksiyon imzalarıdır

bir akış yaratmak için bir işlev gövdesine ihtiyacınız vardır - bu, akışta dönecek olan gövdedir!

Windows'ta bir akışı kaydetmek için yapıyı doldurmanız gerekir:

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES   lpThreadAttributes,
  SIZE_T                  dwStackSize,
  LPTHREAD_START_ROUTINE  lpStartAddress,
  __drv_aliasesMem LPVOID lpParameter,
  DWORD                   dwCreationFlags,
  LPDWORD                 lpThreadId
);

lpStartAddress'e bakın - bu, iş parçacığında çalışacak işlevin giriş noktasının adresidir, bellek tahsisi konusunda sessiz kalacağız

Bu sorunu çözmek için, MQL kullanarak MyFunc() adresini almanın bir yolunu bulmalısınız - bellekte, ama orada değil - kelimeden hiçbir yerde değil, şey... hiç de değil!


Sorunu “parmaklarda” daha anlaşılır bir şekilde nasıl açıklayacağımı bilmiyorum ... ki aslında mevcut değil)))