Thread beenden beim Entladen einer Dll



  • Hallo,

    ich habe einen Thread

    DWORD WINAPI Status(LPVOID lpParameter)
    {
      TListPosition ListPosition;
      CPort *pPort;
      void *pTag;
    
      while (!ThreadExitStatus)
      {
    
        // wait
        Sleep(10);
      }
    
      return 0;
    }
    

    und starte Ihn mit:

    void Init(void)
    {
      ThreadExitStatus = false;
      hThreadStatus = CreateThread(NULL,0,&Status,NULL,0,&ThreadIdStatus);
    }
    

    beendet wird er mit

    void Exit(void)
    {
      if (hThread Status)
      {
         ThreadExitStatus = true;
         WaitForSingleObject(hThreadStatus,INFINITE);
         hThreadStatus = NULL;
      }
    }
    

    wenn ich diesen in der DllMain stoppe dann wir das return des Threads (Zeile 14) nie erreicht obwohl Exit durchläuft.

    BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
    {
    	switch (dwReason)
        {
        case DLL_PROCESS_ATTACH:
    		if (0 == udwProcessCount) Init();
    		udwProcessCount++;
            break;
        case DLL_THREAD_ATTACH:
    
    		break;
        case DLL_THREAD_DETACH:
    
    		break;
        case DLL_PROCESS_DETACH:
    		udwProcessCount--;
    		if (0 == udwProcessCount) Exit();
            break;
        default:
           break;
      }
    
      return TRUE;
    }
    

    Hat jemand eine Idee?



  • Hallo,

    hat den keiner eine Idee. Warum der Thread schon vorher gekillt wurde.

    MfG



  • funktioniert der Code wenn du das ganze als "normale" Windows Anwendung umsetzt (mit WinMain usw?)



  • was hat die WinMain mit der DllMain zu tun?

    Ich dachte immer das wäre nur der Einstiegspunkt aber sie wird nicht nochmal aufgerufen beim verlassen des Programms

    wenn du meinst ob es funktioniert wenn ich den Thread starten und beenden auf einen Button lege, ja das klappt.

    MfG



  • Vllt weil der mainthread früher beendet wird als deiner da? Und somit wird deiner dann nicht mehr ordentlich beendet, sondern eher terminiert.



  • Vermutlich wird Deine Applikation beendet, weil Deine DllMain zu lange braucht um zu beenden?



  • Also noch mal kurz wie ich das jetzt verstehe:

    Die Dll ist per Lib eingebunden das heißt das laden passiert automatisch.

    Wenn jetzt mein Programm beendet wird, beendet sich der Main thread und daraufhin werden alle anderen Threads zu dem Process gekillt

    Und erst danach wird die Dll entladen? Von wem?



  • Du kannst in DllMain nicht auf das Beenden eines Threads warten.

    Grund: sobald ein Thread beendet wird führt er selbst DllMain(DLL_THREAD_DETACH) aus.
    Es darf aber immer nur ein Thread gleichzeitig in DllMain sein, d.h. der zu-beendende Thread wartet bis der erste Thread DllMain verlassen hat.
    Der wartet aber auf den zu-beendenden Thread.

    -> Deadlock



  • Ok

    das verstehe ich aber es kommt ja zu keinem Deadlock.

    Gibt es dann wie in Linux für Dlls auch Initialiserungsmetoden wie:

    void __attribute__ ((constructor)) Init(void);
    void __attribute__ ((destructor)) Exit(void);
    

    oder onload oder sowas änliches

    MfG



  • Destiniy schrieb:

    Ok

    das verstehe ich aber es kommt ja zu keinem Deadlock.

    Bist du sicher?

    Gibt es dann wie in Linux für Dlls auch Initialiserungsmetoden wie:

    void __attribute__ ((constructor)) Init(void);
    void __attribute__ ((destructor)) Exit(void);
    

    oder onload oder sowas änliches

    Ja, DllMain() 😕



  • BTW: udwProcessCount kannst du dir sparen. Es wird immer nur einen Prozess geben. Die Namen "process attach" bzw. "process detach " sind ein Relikt aus gaaaaanz alten Zeiten.



  • Ja, DllMain()

    Aber dort funktioniert ja das Starten und beenden eines Threads nicht. Wie kann ich das Problemm umgehen?

    MfG


Anmelden zum Antworten