Fragen zu CreateEvent/SetEvent/WaitForSingleObject und Threading.



  • Hallo. Wie der Titel schon sagt brauch ich hilfe bei meinem Folgenden problem. Ich versuche ein Kleinen bot zu schreiben, der sachen für mich Automatisch erledigt. Er sollte über events funktionieren. Nun kommen wir zu der frage, zurzeit sieht es bei mir so aus...

    HANDLE Dead; 
    DWORD WINAPI DoSomething(LPVOID lParam);
    
    case bla: // bla passiert, jetz will ich mit dem folgenden code meinem Thread ein signal senden, dass er etwas macht.
    {
    Dead = CreateEvent(NULL, FALSE, FALSE, 0)
    SetEvent(Dead);
    if(Dead == NULL)
    {
       printf("CreateEvent Failed (%d)\n", GetLastError());
    }
    
    }break;
    
    Jetzt kommen wir zu dem Thread...
    
    DWORD WINAPI DoSomething(LPVOID lParam)
    {
    
       while(running)
       {
             DWORD CheckSomething = WaitForSingleObject(Dead, INFINITE);
             switch(CheckSomething)
             {
             case WAIT_OBJECT_0: // falls event gesendet wird, code ausführen.
             {
    
              // hier wird der code ausgeführt, welcher auch funktioniert. 
              ResetEvent(Dead);
    
             }break;
             }
         }
    return 0;
    }
    

    Ich starte den Thread über ein Button, welcher den bool running auf true setzt. Mein problem bei der sache ist, dass der Thread nur ein mal ausgeführt wird, und dann falls das event gesendet wird "stirbt" der Thread. Meine frage ist, wie kann ich den Thread so hinbiegen, dass er immer läuft falls running == true ist, und nicht das er gleich "Stirbt" falls er den Code ausführt.

    Grüße



  • Woher kommt running? Ist running volatile? Selbst dann, wenn ein Thread im selben Addressraum wie der erzeugende (primary) Thread steht, hat dein (secondary) Thread einen Stack, mit dem er arbeitet. LPVOID lParam wird auch auf diesen Stack gepackt, ist also eine Kopie. running muss veränderbar sein.

    class someclass
    {
    private:
    volatile bool running;
    static DWORD WINAPI Thread(LPVOID parent);
    public:
    int somepublic;
    };

    CreateThread(..., SomeClass::Thread,(LPVOID)this,...);



  • Ausserdem steht das break; nicht im case und beendet somit die while-schleife. Setz das break, mal vor die geschweifte, schließende Klammer. Die Klammern brauchst du gar nicht:

    switch (anything)
    {
    case anything0:
    someInstructions;
    break;
    }


  • Mod

    chezzmatazz schrieb:

    Ausserdem steht das break; nicht im case und beendet somit die while-schleife. Setz das break, mal vor die geschweifte, schließende Klammer. Die Klammern brauchst du gar nicht:

    switch (anything)
    {
    case anything0:
    someInstructions;
    break;
    }

    Unfug!
    Er hat den case Block in eine geschweifte Klammer gesetzt. Der break sitzt absolut richtig.

    Anmerkung: Geschweifte Klammern um einen case Block sind kein schlechter Stil, vor allem erlauben sie lokale Variablen im case Block zu nutzen, die sonst Compiler Warnungen auslösen.
    Wo das break steht ob in der geschweiften Klammer oder außerhalb ist egal.

    switch (anything)
    {
      case anything1:
      {
        CMyClassI i;
        GetSomeI(i);
        DoSome(i)
      }
      break;  
      case anything2:
      {
        CMyClassJ j;
        GetSomeI(j);
        DoSome(j)
      }
      break;
    }
    

    Ich setze die Breaks nicht gerne in den Block. Weil durch die Indentierung das break nicht mehr auf Höhe des case steht.


  • Mod

    bier schrieb:

    Meine frage ist, wie kann ich den Thread so hinbiegen, dass er immer läuft falls running == true ist, und nicht das er gleich "Stirbt" falls er den Code ausführt.

    Dein Thread terminiert doch nur wenn running auf false geht!
    Was ist Dein Problem? Ist running evtl. gar nicht true?

    Ist running auch wirklich privat für jeden Thread (also nicht statisch)?



  • Muss mich für meine verspätete Antwort entschuldigen, hatte leider keine zeit.

    Das problem lag nicht an dem Thread, sondern das ich die Events falsch benutzt hatte. Danke für eure antworten. Falls irgendwelche probleme auftreten, werd ich mich sicher wieder bei euch melden. :p

    @Martin

    Vielleicht könnten sie dem Admin vorschlagen, dass man sich Registrieren muss bevor man Posten kann, gibt ja mehrere Threads mit Spam Bots drinne. Würd mich dann auch Anmelden. ^^


  • Mod

    bier schrieb:

    @Martin

    Vielleicht könnten sie dem Admin vorschlagen, dass man sich Registrieren muss bevor man Posten kann, gibt ja mehrere Threads mit Spam Bots drinne. Würd mich dann auch Anmelden. ^^

    Das wurde schon mehrfach diskutiert... Siehe Forum Technik!


Anmelden zum Antworten