Hatalar, hatalar, sorular - sayfa 2540

 
Сергей Таболин :

Ne istiyorsun?

böylece sizin gibi beceriksiz insanlar, Fedoseev vb. yorumları ile böcekler ve tasarımlar tartışmasına girmesin.

böylece MQL'de bir bütün olarak C++'dan alınan ve C++'dakiyle aynı görünen yapılar ve mekanizmalar, C++'dakiyle aynı şekilde çalışır.

Sergey Tabin :

MQL'nin tam bir C++ analogu olması için mi?

bu saçmalık ve bunu biliyorsun ama atmalısın.
Sergey Tabin :

Ve bu konuda sızlanmayı ve sümük köpürmeyi kes. Bu tür "tartışmalar" için ayrı bir konu açtım.

sadece sen ağla. nasıl elde ettikleri, ayrı bir dil ve ayrı bir dal hakkında.

kendine ve sempati duyanlara ve Nuh'a ayrı bir şube aç.

 
Terminali mqd dosyasını serbest bırakmaya nasıl zorlayabilirim? Ya da onu arayüzden kaldırmanın düzenli bir yolu olsaydı daha mı iyi olurdu?
 
Stanislav Korotky :
Terminali mqd dosyasını serbest bırakmaya nasıl zorlayabilirim? Ya da onu arayüzden kaldırmanın düzenli bir yolu olsaydı daha mı iyi olurdu?

Sorunun ne hakkında olduğunu kabaca tahmin ediyorum. Daha iyi yeniden formüle edin.

 
Bence Hizmetlerde dll sıfırlama ile ilgili bir sorun var, çözmeme yardım edin.
Sorun şu. Servis menüsünde "Dur" komutuna bastıktan sonra, terminal nedense Fn() işlevinin tamamlanmasını beklemiyor.
Zamanında dll ile bağlantıyı kesmeye, terminali kapatmaya veya tamamen çökmeye (kapanmaya) çalışır.
DllMain giriş noktasındayken, DLL_PROCESS_DETACH içindeki Ayır bayrağı, bayrağı while döngüsünü sonlandıracak şekilde ayarlar.

Ancak, diğer tüm işlemlerin ek tamamlanmasından sonra aşağıdaki işlevleri yürütmek için döngüden çıkmak için zaman yok.
Ve Fn() işlevinin kendisini tamamlayın.
DestroyFunction(); bu örnekte bir test görevi görür.

dll içeriği

 #define EXP extern "C" __declspec(dllexport)

void DestroyFunction( void );
EXP void __stdcall Fn( int num);

bool Detach;

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

//---------------------------------------------------------------------
void DestroyFunction()
{
        MessageBoxW( NULL , L "Start DestroyFunction" , L "OK" , MB_OK );

         return ;
}

//---------------------------------------------------------------------
EXP void __stdcall Fn( int num)
{
         int count = num;

         while (Detach == false )
        {
            //Имитация работы цикла
            count++;    

            if (count > 0 )
                MessageBoxW( NULL , L "Start While iteration" , L "OK" , MB_OK );

            Sleep ( 10000 );
        }       

 
        //После нажатия команды "Остановить" в меню Сервис, с юда уже не доходим, так как уже висим, или вылетел терминал.
        DestroyFunction();

        
         return ;
}


Programın İçeriği Hizmet.
_StopFlag bayrağında ek bir gecikme yardımcı olmaz.

 //+------------------------------------------------------------------+
//|                                                      BugDll.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property service
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property script_show_inputs


#import "BugDll.dll"
   void Fn( int num);
#import


//+------------------------------------------------------------------+
//| Service program start function                                   |
//+------------------------------------------------------------------+
int OnStart ()
{      
   
   Fn( 0 );

   if ( _StopFlag )
       Sleep ( 10000 );
   
   return ( 0 );
}
//+------------------------------------------------------------------+
Dosyalar:
MQL5.zip  54 kb
 
Roman :
Bence Hizmetlerde dll sıfırlama ile ilgili bir sorun var, çözmeme yardım edin.

dll hizmetin bitiminden hemen sonra (zorunlu olarak) boşaltılmıyor (yanılıyor olabilirim)

her durumda, DLL_PROCESS_DETACH ile yaptığınız şey zaten çok geç. Bu bayrağı ayarlayacak ve hizmet sona erdiğinde açıkça çağrılacak olan dll'de açık bir tanımlama işlevi yapın.

 
Roman :

Terminal, akış start() işlevinden döndükten sonra lib'i boşaltmaya başlayacak, sanırım. Ve nasıl çalışır? Program çalışıyor ve bunun için çevreyi bozmaya mı başladınız? Bu saçmalık. Komut dizisini bir döngüde takip etmek yerine lib'de ayrı bir iş parçacığı çalıştırın ve şimdi normal şekilde tamamlayabilir.

 
Vict :

Terminal, akış start() işlevinden döndükten sonra lib'i boşaltmaya başlayacak, sanırım. Ve nasıl çalışır? Program çalışıyor ve bunun için çevreyi bozmaya mı başladınız? Bu saçmalık. Kitaplıkta ayrı bir iş parçacığı başlatın ve şimdi normal şekilde tamamlayabilecektir.

İşin aslı, iş parçacıkları ile aynı sorun ve bu nedenle, yok edilmesi gereken bir grup nesneye sahip diğer işlemleri (iş parçacığı) doğru şekilde sonlandıramıyorum.
Bu nedenle, kontrol etmek için yukarıda basit bir örnek yaptım ve sorunun tamamen farklı olduğu ortaya çıktı.
Terminal DLL_PROCESS_DETACH çıkış noktasıyla düzgün çalışmıyor

TheXpert tarafından önerildiği gibi deneyeceğim, ancak terminalin DLL_PROCESS_DETACH ne olursa olsun dll'yi hemen kaldırması gerçeği muhtemelen bir terminal hatasıdır.

TheXpert :

dll hizmetin bitiminden hemen sonra (zorunlu olarak) boşaltılmıyor (yanılıyor olabilirim)

her durumda, DLL_PROCESS_DETACH ile yaptığınız şey zaten çok geç. Bu bayrağı ayarlayacak ve hizmet sona erdiğinde açıkça çağrılacak olan dll'de açık bir tanımlama işlevi yapın.

Bahşiş için teşekkürler, deneyeceğim.

 
Roman :

İşin aslı, iş parçacıkları ile aynı sorun ve bu nedenle, yok edilmesi gereken bir grup nesneye sahip diğer işlemleri (iş parçacığı) doğru şekilde sonlandıramıyorum.
Bu nedenle, kontrol etmek için yukarıda basit bir örnek yaptım ve sorunun tamamen farklı olduğu ortaya çıktı.
Terminal DLL_PROCESS_DETACH çıkış noktasıyla düzgün çalışmıyor

TheXpert'in önerdiği gibi deneyeceğim, ancak terminalin DLL_PROCESS_DETACH'den bağımsız olarak dll'yi hemen kaldırması gerçeği muhtemelen bir terminal hatasıdır.

Bahşiş için teşekkürler, deneyeceğim.

Ve dll'nin ayrı bir iş parçacığında yaşadığı fikrini nereden aldınız? Programın, döngü koşullarında işlenmemiş, banal bir acil durum sonlandırmasına sahipsiniz.

Ve DLL_PROCESS işlemine bir dll bağlandığında / bağlantısı kesildiğinde ve bu DLL_THREAD işleminde oluşturulan bir iş parçacığı oluşturulduğunda / sonlandırıldığında DllMain başlatılır. Bu nedenle, bool Detach'iniz, dll'nin içinde bile var olduğu gerçeği değil, çünkü derleyici optimizasyonun bir parçası olarak kaldırabilir, çünkü dll'nin ömrü boyunca tüm işlevlerin yürütülmesi sırasında değişmez ve false değerine eşittir. .

 
Vladimir Simakov :

Ve dll'nin ayrı bir iş parçacığında yaşadığı fikrini nereden aldınız? Programın, döngü koşullarında işlenmemiş, banal bir acil durum sonlandırmasına sahipsiniz.

Ve DLL_PROCESS işlemine bir dll bağlandığında / bağlantısı kesildiğinde ve bu DLL_THREAD işleminde oluşturulan bir iş parçacığı oluşturulduğunda / sonlandırıldığında DllMain başlatılır. Bu nedenle, bool Detach'iniz, dll'nin içinde bile var olduğu gerçeği değil, çünkü derleyici optimizasyonun bir parçası olarak kaldırabilir, çünkü dll'nin ömrü boyunca tüm işlevlerin yürütülmesi sırasında değişmez ve false değerine eşittir. .

Hiçbir yerde dll'nin ayrı bir iş parçacığında yaşadığı söylenmedi.
Konuşan Vict ve bendik ve ne hakkında konuştuğumuzu anladık ))
Kilitlenmenin anlaşılabilir olması, DLL_PROCESS_DETACH içindeki bayrağın while döngüsünden çıkmak için neden çalışmadığı açık değildir.
DLL_THREAD gelince, mql için hiç mevcut değiller, bu bu makalede yazılmıştır, kontrol ettim, gerçekten çalışmıyorlar.
Ancak bir seçenek olarak VS derleyicisi ile komik de olabilir.
Yetkili temsilcilerin açıklamalarını duymak istiyorum ve tahmin değil))

 
Roman :
Bence Hizmetlerde dll sıfırlama ile ilgili bir sorun var, çözmeme yardım edin.
Sorun şu. Servis menüsünde "Dur" komutuna bastıktan sonra, terminal nedense Fn() işlevinin tamamlanmasını beklemiyor.
Zamanında dll ile bağlantıyı kesmeye, terminali kapatmaya veya tamamen çökmeye (kapanmaya) çalışır.
DllMain giriş noktasındayken, DLL_PROCESS_DETACH içindeki Ayır bayrağı, bayrağı while döngüsünü sonlandıracak şekilde ayarlar.

Ancak, diğer tüm işlemlerin ek tamamlanmasından sonra aşağıdaki işlevleri yürütmek için döngüden çıkmak için zaman yok.
Ve Fn() işlevinin kendisini tamamlayın.
DestroyFunction(); bu örnekte bir test görevi görür.

dll içeriği


Programın İçeriği Hizmet.
_StopFlag bayrağında ek bir gecikme yardımcı olmaz.


Böylece kontrolü terminale geri döndürmediniz, DLL'de Fn içindeki "sonsuz" bir döngüde "asıldınız".
Ne normal bir son!

Böyle bir davranışa ihtiyacınız varsa, o zaman DLL'deki Fn içinde, ayrı bir FnStop işlevinde ayarlanmış bir bayrak tarafından durdurulabilen bir döngü ile ayrı bir iş parçacığı başlatmanız gerekir ve DLL_PROCESS_DETACH
Neden: