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

 
Vict :

Birbirimizi anlamadığımız bir şey.

Ama zahmet etmeyin - µl içinde CreateThread() aracılığıyla bir iş parçacığı oluşturmayacaksınız, bir işleve (iş parçacığının başlayacağı) bir işaretçi iletmeniz gerekir, ancak yukarıda belirtildiği gibi - bir çerez.

Gerekli sayıda iş parçacığını kendi başına oluşturacak kendi DLL'nizi yapın.

Karmaşık hesaplamalar yapmak istiyorsanız, saf WinAPI çağrıları yeterli değildir.

Evet, birçok WinAPI çağrısının standart prototiplerini yaptık, ancak bu, hepsinin doğrudan MQL'den çağrılabileceği anlamına gelmez.

 
Igor Makanu :

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:

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 bu özünde değil)))

Dahil etmede, parametrelerle birlikte taşınan bir işlev var, fark nedir?

HANDLE  CreateThread(PVOID thread_attributes, 
                     ulong stack_size, 
                     PVOID start_address, 
                     PVOID parameter, 
                     uint creation_flags, 
                     uint &thread_id);

Ve işte taşınan bir fonksiyon, fonksiyonun adresini alıyor

PVOID  GetProcAddress(HANDLE module,
                      uchar &proc_name[]);
 

Aslında, işlevlerin fiziksel adresleri mevcut olmadığından CreateThread'i MQL'den tam olarak arayamazsınız.

Gerçek işleyiciler sağlayacak kendi DLL'nizi yapmanız gerekir.

 
MetaQuotes Software Corp. :

Aslında, işlevlerin fiziksel adresleri mevcut olmadığından CreateThread'i MQL'den tam olarak arayamazsınız.

Gerçek işleyiciler sağlayacak kendi DLL'nizi yapmanız gerekir.

Teneke. CreateThread() öğesine taşınır; ve GetProcAddress();
Ve
fonksiyonların fiziksel adreslerini alamıyorsunuz, sorun ne? ))
Güvenlik iyi bir şeydir, ancak gördüğünüz gibi standart WinAPI'yi kullanma yeteneğini sınırlar.
O zaman neden bu işlevleri taşımak ve bunları standart mql kitaplığına eklemek gerekliydi?
Kullanılamıyorsa kullanıcıyı yanıltmak))
Ve standart WinAPI'yi kullanmaktan kurtulmak istediğim kendi eşzamansız dll'nizi yazmanızı öneriyorsunuz.
Ama görünüşe göre kendi eşzamansız dll'nizi yazmaya geri dönmeniz gerekiyor.

ps
İşte mql'nin tuzakları, her zaman Google'a göndermeyi sevenler için bu bilgiler tanım gereği orada değil.

 
Roman :

Teneke. CreateThread() öğesine taşınır; ve GetProcAddress();
Ve
fonksiyonların fiziksel adreslerini alamıyorsunuz, sorun ne? ))
Güvenlik iyi bir şeydir, ancak gördüğünüz gibi standart WinAPI'yi kullanma yeteneğini sınırlar.
O zaman neden bu işlevleri taşımak ve bunları standart mql kitaplığına eklemek gerekliydi?
Kullanılamıyorsa kullanıcıyı yanıltmak))
Ve standart WinAPI'yi kullanmaktan kurtulmak istediğim kendi eşzamansız dll'nizi yazmanızı öneriyorsunuz.
Ama görünüşe göre kendi eşzamansız dll'nizi yazmaya geri dönmeniz gerekiyor.

ps
İşte mql'nin tuzakları, her zaman Google'a göndermeyi sevenler için bu bilgiler tanım gereği orada değil.

WinAPi işlev prototiplerini işlevsel taşımayla karıştırmayın.

Geliştiricilerin tekerleği yeniden icat etmek zorunda kalmamaları için standart WinAPI işlevlerinin prototiplerini sağlama konusunda bilerek harika bir iş çıkardık. Bu bir kütüphane değil, açıklamalar.

Ham WinAPI açıklamalarının varlığı, güvenli olmayan aramalar için bir garanti/olasılık sağladığımız anlamına gelmez.

Bu seviyedeki bir uygulama dilinde güvenlik çok önemlidir.

 
Hmm... O zaman başka bir sorun beliriyor.
O zaman mql'den yüklenen dll'yi ve dışa aktarılan işlevleri başlatmak nasıl normaldir?

LoadLibraryW( "MyDll.dll" );
GetProccAddress(hMyDll, "MyFunc" );
 
Roman :
Hmm... O zaman başka bir sorun beliriyor.
O zaman mql'den yüklenen dll'yi ve dışa aktarılan işlevleri başlatmak nasıl normaldir?

Okumayı biliyor musun? ve aramayı kullan? Bu kaynakta DLL yazmakla ilgili 20'den fazla makale var, bazı makaleler "ilk elden" yazılmıştır - yöneticiler (geliştiriciler), okuyun, yapın, her şey ücretsiz olarak mevcuttur - programlama dillerini bilmeden DLL nasıl yazılacağına dair daha ayrıntılı talimatlar ​ağda değil, burada sadece bu sitede! - resimlerle bile!

ne arıyorsun? - sel yasağı?

Roma :

Ama görünüşe göre kendi eşzamansız dll'nizi yazmaya geri dönmeniz gerekiyor.

seni yazmaktan alıkoyan ne? tantana seslerine mi ihtiyacınız var? - Temel C++'a az çok aşina olan veya hatta C#'da daha kolay olan herkes - gün boyunca bu bilgiyi google'da aratabilir, koda yazabilir ve kontrol edebilir, tek ihtiyacınız olan "arzu ve çalışkan eşek" - yani adminlerden biri yazmış, IMHO, daha doğrusu ifadeyi alamazsınız



Not: Yöneticinin bir saat içinde kullanıcıya bu kadar çok cevap yazdığını hatırlamıyorum, ne değişti? Yoksa bugün yıldızlar böyle mi sıralandı? ))))))

 
Igor Makanu :

Okumayı biliyor musun? ve aramayı kullan? bu kaynakta DLL yazmakla ilgili 20'den fazla makale var, bazı makaleler "ilk elden" yazılmıştır - adminler (geliştiriciler), okuyun, yapın, her şey ücretsiz olarak mevcuttur - programlama bilmeden bir DLL nasıl yazılacağına dair daha ayrıntılı talimatlar diller ağda değil, burada sadece bu sitede! - resimlerle bile!

ne arıyorsun? - sel yasağı?

Not: Yöneticinin bir saat içinde kullanıcıya bu kadar çok cevap yazdığını hatırlamıyorum, ne değişti? Yoksa bugün yıldızlar böyle mi sıralandı? ))))))

Bu makalelerde dll'nin başlatılması ve işlevleri hakkında bir açıklama yoktur !!!
Dll kütüphanesinin başlangıç durumuna getirilmesinin ve dışa aktarılan işlevlerin başlatılmasının nerede açıklandığını gösterin, sadece minnettar olacağım.
Forumla iletişime geçmeden önce insanların makaleleri okumadığını düşünmenize gerek yok!

Igor Makanu :

seni yazmaktan alıkoyan ne? tantana seslerine mi ihtiyacınız var? - Temel C++'a az çok aşina olan veya hatta C#'da daha kolay olan herkes - gün boyunca bu bilgiyi google'da aratabilir, koda yazabilir ve kontrol edebilir, tek ihtiyacınız olan "arzu ve çalışkan eşek" - yani adminlerden biri yazmış, IMHO, daha doğrusu ifadeyi alamazsınız

Hiçbir şey karışmaz! Saf WinAPI kullanmak için bir görev vardı. Özel dll yok!
Konu mql'de çok iş parçacıklı programlama sorununu tartışmak için oluşturuldu, bugün bir tür olumsuz ruh haliniz var mı, oluşturduğum konuda ne tür bir flood?
Lütfen bu tür yorumlardan kaçının.

 
Roman :
Hmm... O zaman başka bir sorun beliriyor.
O zaman mql'den yüklenen dll'yi ve dışa aktarılan işlevleri başlatmak nasıl normaldir?

Bu işlevleri mql'ye sürüklemek gerekli değildir. Orada dll'de süreçler oluşturun.

 
Dmitry Fedoseev :

Bu işlevleri mql'ye sürüklemeye gerek yoktur. Orada dll'de süreçler oluşturun.

DLL'nizi DLL_PROCESS_ATTACH içinde başlatın: mql programından çağırmanız yeterli olacak mı?
WinAPI işlevleriyle sorunsuz çalışmanın mümkün olduğunu ve kapalı dll'lerin ek olarak başlatılması gerektiğini düşündüm,
LoadLibraryW( "MyDll.dll" );