kleine rätselfrage: warum funktioniert dieser code nicht?



  • MFK schrieb:

    Es würde mich sehr wundern, wenn sich der Status des überwachten Threads ändert, während ein anderer auf der Stelle rotiert.

    windows macht preemptives multitasking. daran sollte es nicht scheitern.

    MFK schrieb:

    Ändert sich das Verhalten mit Sleep(0)?

    naja, es könnte dafür sorgen, dass der compiler für die abfrage leicht anderen code erzeugt (au weia, jetzt habe ich zuviel verraten)



  • also eigentlich meinte ich sowas:

    [code]int test
    test = GetExitCodeThread(...);
    if(test == 0)
     //Es stimmt was nicht[/code]
    

    Klar, dass exitcode nur STILL_ACTIVE oder 0 sein kann



  • Ominion schrieb:

    GetExitCodeThread gibt STILL_ACTIVE oder 0 zurück.

    Nein.

    Und was du sonst so geschrieben hast, ist auch mehr oder weniger Quatsch.



  • Die Lösung steht doch in der Docu ganz unten...



  • hab's gerade ausprobiert: ein Sleep(0) dazwischen ändert nix. dis schleife hängt wie bisher 😃



  • Kann es sein, dass GetExitCodeThread irgendwie frühzeitig zurückspringt?



  • net schrieb:

    windows macht preemptives multitasking. daran sollte es nicht scheitern.

    Nein, aber es ist sinnlos. Ungefähr so sinnlos, wie pausenlos nachzusehen, ob noch genug Klopapier da ist. Auch wenn zwischendurch niemand die Toilette benutzt hat.

    net schrieb:

    naja, es könnte dafür sorgen, dass der compiler für die abfrage leicht anderen code erzeugt (au weia, jetzt habe ich zuviel verraten)

    Spielst du irgendwelche Spielchen? "Wenn ich mir mit der Kettensäge die Nägel schneide, klappt das nicht. Wer mir sagen kann, wieso, ist ein toller Hecht"?

    Dafür ist mir meine Zeit zu schade.



  • Requirements
    Runs on Versions Defined in Include Link to
    Windows CE OS 1.01 and later Winbase.h Coredll.lib

    lol?? Wars das?



  • Was heißt Quatsch? Im gewissen sinne kann das von Bedeutung sein. Verbessert mich wenn ich falsch leige, aber man muss diese geschweiften Klmmern setzen, sobald man mehr als 1 Codezeile hat.

    Mfg Ominion

    [EDIT]Ist noch auf den Beitrag von MFK von ihn für mich bezogen[/EDIT]



  • Liest eigentlich niemand von Euch die Doku zu "GetExitCodeThread"??? Da steht es doch ganz unten... *kopfschüttel*



  • Jochen Kalmbach schrieb:

    Die Lösung steht doch in der Docu ganz unten...

    meinst du das warning in den remarks von GetExitCodeThread()?
    das ist es nicht. mein thread setzt den exitcode auf 0, nicht STILL_ACTIVE



  • net schrieb:

    Jochen Kalmbach schrieb:

    Die Lösung steht doch in der Docu ganz unten...

    meinst du das warning in den remarks von GetExitCodeThread()?
    das ist es nicht. mein thread setzt den exitcode auf 0, nicht STILL_ACTIVE

    Dann hast DU uns nicht den korrekten Code gezeigt... eine Endlosschliefe entsteht nur mit:

    #include <windows.h>
    #include <stdio.h>
    #include <tchar.h>
    
    DWORD WINAPI t(LPVOID)
    {
      return STILL_ACTIVE;
    }
    int _tmain()
    {
      DWORD tid;
      HANDLE hT = CreateThread(NULL, 0, t, 0, 0, &tid);
      DWORD exitcode = STILL_ACTIVE; 
      while (exitcode == STILL_ACTIVE) 
        GetExitCodeThread (hT, &exitcode);
    }
    

    Wird was anderes zurückgegen, so beendet sich das Programm tadellos.



  • Jochen Kalmbach schrieb:

    Wird was anderes zurückgegen, so beendet sich das Programm tadellos.

    nicht immer. das ist ja das schlimme. wollt ihr noch rätseln oder soll ich sagen woran's lag?



  • es könnte auch TerminateThread(threadhandle,STILL_ACTIVE) sein



  • Sag es uns du Ratefuchs!

    Mfg Ominion



  • Es ist natürlich auch miserabel den Rückgabewert nicht zu prüfen... wenn das Handle nicht genügend Rechte hat, gibt es auch Probleme...



  • Hallifax schrieb:

    es könnte auch TerminateThread(threadhandle,STILL_ACTIVE) sein

    nein, es werden keine faulen tricks verwendet. die threadfunction sieht ungefähr so aus

    DWORD thread (DWORD param)
    {
       for (;;)
       {
          if (stop_the_thread == TRUE)
             return 0;
         // hier etwas anderer code
         // ohne return, ExitThread() und dergleichen
       }
    }
    


  • Jochen Kalmbach schrieb:

    Es ist natürlich auch miserabel den Rückgabewert nicht zu prüfen... wenn das Handle nicht genügend Rechte hat, gibt es auch Probleme...

    leider auch nicht. das handle wird vom gleichen prozess erzeugt. rückgabewert direkt von CreateThread()... und der thread wird auch gestartet d.h. handle ist gültig, nicht INVALID_HANDLE_VALUE oder sowas



  • Dann hast Du zumindest Deine Threadproc falsch angegeben (hier fehlt ein WINAPI; ganz abgesehen davon, dass der übergabeparameter auch falsch deklariert ist (müsste LPVOID sein)).



  • Jochen Kalmbach schrieb:

    Dann hast Du zumindest Deine Threadproc falsch angegeben (hier fehlt ein WINAPI).

    sorry, das hatte ich vergessen. im original steht da noch ein __stdcall. doch auch wenn ich es wegnehme ändert das nichts an dieser misteriösen endlosschleife


Anmelden zum Antworten