Thread von aussen beenden funktioniert nicht


  • Administrator

    @net
    probiert -> gehofft -> noch mehr gehofft -> Thread starten lassen -> Gehofft bis zum explodieren -> Escape gedrückt -> hoch enttäuscht ^^

    Hat keine Änderungen gebracht. Aber danke für den Versuch ^^

    @connan
    Und wenn keine Nachricht wartet? Also wie kann ich meinen Threadcode mit dem abrufen der Nachrichten kombinieren?

    Grüssli



  • dann hast du bestimmt zwei variablen mit dem namen 'G_bStopThread'. vielleicht eine als class member und eine globale, so dass die sich irgendwie überdecken...

    lass die beim debuggen mal die adresse von 'G_bStopThread' anzeigen. auch die, die der thread benutzt


  • Administrator

    Aus dem CommandWindow - Immediate

    &G_bStopThread
    0x006b1230 bool volatile G_bStopThread
    &G_bStopThread
    0x006b1230 bool volatile G_bStopThread
    

    Das obere aus dem Thread, das untere bei OnKeyDown. Zudem ich weiss selber, dass ich keine zweite Variable definiert habe, welche so heisst. Es hat in diesem Programm nicht mal eine andere Variable die mit G_ anfängt ^^

    Grüssli



  • okay, und wie siehts mit der initialisierung von 'G_bStopThread' aus. kann es sein dass die mehrmals stattfindet? irgendwas kann die wieder auf 'false' setzen? vielleicht ein wilder pointer?

    ach ja, mach mal ein komplettes rebuild von dem projekt (auch alle vorher erzeugten .obj dateien löschen). die m$ ide's kriegen manchmal was nicht mit.


  • Administrator

    Komplett rebuild hat nix gebracht. Hab das schon selber probiert -> Immer wenn das Problem völlig unlogisch ist komplett rebuild machen, vielleicht funktioniert es dann. Leider isses hier nicht der Fall.

    G_bStopThread wird nicht mehrmals initialisiert. Und wenn, dann immer auf true. Der Wert wird nur an einem Punkt auf false gesetzt, dass ist beim Threadstart, allerdings noch im Mainthread.
    Ein wilderpointer ist es sicherlich auch nicht. Schon nur weil ich nie irgend ein Pointer auf G_bStopThread übergebe oder sonst wie mit seinem Pointer arbeite. Zudem, dass Problem tratt ja auch mit CEvent auf, nicht vergessen! ^^

    Ich probier jetzt mal die Messageschlaufe einzubauen. Hab dazu ein paar MSDN Artikel gelesen und denke ich könnte das implementieren. Doch so ganz zufrieden wäre ich damit nicht. Erstens möchte ich lernen die CEvents zu benutzen, zweitens befürchte ich grössere Einbusen in der Geschwindigkeit meines Threads, wenn ich immer zuerst nach Nachrichten durchsuche. Hat ein Thread nicht auch selbsterzeugte Nachrichten, die müsste ich dann nämlich auch abarbeiten, was zu Verzögerungen kommt.

    Grüssli



  • naja, das mit der globalen variablen muss eigentlich funktionieren. erst recht, wenn die 'volatile' ist. bestimmt machst du irgendwas anderes falsch, z.b. editierst eine datei, compilierst aber eine andere...



  • hmm,
    ich hab in einen Beispiel gesehen dass das WaitForSingleObject() nach dem AfxBeginThread() aufgerufen worden ist, kannst du es dort positionieren??

    m_pEvent = new CEvent(FALSE, TRUE);
    
    AfxBeginThread(ThreadFunc, (LPARAM)m_pEvent);
    
    // dann hier in der selben Funktion: 
    WaitForSingleObject(...);
    

    versuch mal, vielleicht hilfts!

    lg
    pixel


  • Administrator

    Jetzt habe ich grad was ganz seltsames entdeckt ^^
    Ich habe nun das mit dem PostThreadMessage eingeführt. Es funktioniert nicht. Aber nur im normalen Betrieb nicht. Hmmm mal schauen wie ich das erkläre ^^

    if(nChar == VK_ESCAPE && m_pThread != NULL)
    {
        m_pThread->PostThreadMessage(Global::WM_THREADEND, 0, 0);
        // G_bStopThread = true;
    }
    

    Das steht aktuelle in OnKeyDown. Wenn ich einen Breakpoint auf m_pThread->PostThreadMessage(...) setze, dann kann ich Escape im Programm drücken soviel wie ich will, es wird nie stoppen. Wenn ich den Breakpoint auf der if-Anweisung setze und im Programm Escape drücke, dann wird der Breakpoint aufgerufen. Wenn ich dann F10 drücke für den nächsten Schritt, geht er auch in die Anweisung rein, postet die Message und beendet dann den Thread.

    Kann mir dies nun jemand erklären? ^^

    [Edit]
    @Pixel, worauf soll denn dort gewartet werden? Und wie lange? Auf den Thread oder das Event? Und wieso soll überhaupt im Mainthread gewartet werden. Der hat anderes zu tun, nämlich auf Input des Users zu warten. Z.b. ob der Escape drückt 😉
    [/Edit]

    Grüssli



  • Dravere schrieb:

    @connan
    Und wenn keine Nachricht wartet? Also wie kann ich meinen Threadcode mit dem abrufen der Nachrichten kombinieren?

    Du kannst deinen Code z.B. vor dem Ende der Schleife einfügen.


  • Administrator

    connan schrieb:

    Dravere schrieb:

    @connan
    Und wenn keine Nachricht wartet? Also wie kann ich meinen Threadcode mit dem abrufen der Nachrichten kombinieren?

    Du kannst deinen Code z.B. vor dem Ende der Schleife einfügen.

    Danke hab es schon selber rausgefunden, wie man es eigentlich aus meinem letzten Post herauslesen könnte 😃
    Aber das Problem besteht wie gesagt immer noch, bzw. inzwischen habe ich das Gefühl es liegt an was anderem, aber kann es wie gesagt nicht definieren. Schaut euch die Beschreibung meines letzten Posts an und sagt mir, was euch dazu einfällt ^^

    Grüssli



  • erstelle ein neues projekt und kopier deine bestehenden codes da rein. nur ein versuch auf doof, aber vielleicht geht das.


  • Administrator

    net schrieb:

    erstelle ein neues projekt und kopier deine bestehenden codes da rein. nur ein versuch auf doof, aber vielleicht geht das.

    Ist das ernst gemeint oder muss ich das als Witz auffassen? 0o ...
    Wieso sollte das was ändern? Und ihr wollt mir doch nicht verklickern, dass ihr da auch nicht weiter wisst? Ihr seid doch meine Vorbilder, die Allwissenden, während ich nur der Neuling bin, dass könnt ihr mir doch nicht antun 😃 ...

    Grüssli



  • Dravere schrieb:

    Ist das ernst gemeint oder muss ich das als Witz auffassen? 0o ...

    ist ernst gemeint. sowas hilft, wenn irgendwelche projektdateien kaputt sind.



  • wir könnten dir helfen wenn du uns den sourcecode zum download anbietest.


  • Administrator

    net schrieb:

    Dravere schrieb:

    Ist das ernst gemeint oder muss ich das als Witz auffassen? 0o ...

    ist ernst gemeint. sowas hilft, wenn irgendwelche projektdateien kaputt sind.

    Ein kleines bisschen viel Arbeit. Deshalb die Frage, gibt es noch irgendwelche andere Möglichkeiten ausser dem?

    Grüssli



  • Dravere schrieb:

    [
    Ein kleines bisschen viel Arbeit.

    nö,
    - ein neues, leeres projekt erstellen
    - alle bestehenden codes .cpp/.h/.rc usw. in den neuen ordner kopieren
    - in der ide rechte maustaste auf den projektnamen -> hinzufügen -> vorhandenes element hinzufügen -> alle dateien auswählen
    - fertig ist das neue projekt


  • Administrator

    Ok ich hab es gemacht ... Resultat ... es funktioniert immer noch nicht. *seufz und langsam die Hoffnung verliert, dass noch irgendwann zu lösen*

    Grüssli



  • dann pack mal das ganze projekt inne .zip datei und schick es an pittbull_nt@yahoo.com


  • Administrator

    net schrieb:

    dann pack mal das ganze projekt inne .zip datei und schick es an pittbull_nt@yahoo.com

    Dann suche ich zuerst nochmals selber weiter. *schämt sich zu sehr für den unprofessionellen Code*

    Ansonsten keine Idee? Gerade auch wegen dem, dass es mit einzelnen Schritten funktioniert, aber wenn man es normal laufen lässt nicht?

    Grüssli


  • Administrator

    Vielen vielen vielen Dank für die gesamte Hilfe. Ich habe das Problem gelöst. Es ist sowas von unheimlich dumm. Bin aber erst dem ganzen auf die Schliche gekommen, als ich gemerkt habe, dass meine View kein Fokus hat, wenn der Thread läuft und ich Escape drücke. Das Escape wurde ganz wo anders hingeschickt. Nun weiss ich wieso, warum, wann, wo und all das Zeugs. Anderst gesagt, Problem gelöst. Sorry das ich eure kostbare Zeit verschwendet habe.

    Grüssli


Anmelden zum Antworten