probleme mit _endthread()



  • Moin,

    ich habe einen thread mit _beginthread([...]) erstellt und möchte ihn geg. mit _endthread() beenden.

    Mein Problem ist, dass mit _endthread() das programm (und zwar das gesamte, nicht nur der thread) beendet wird... das prog. verschwindet aus der taskleiste, ist aber im taskmanager noch ganz unten aufgelistet und muss manuell beendet werden.

    Das ist nicht mein Ziel!!! Ich möchte bloß den thread beenden.

    eine abfrage auf ne variable zur selbstbeendung des threads (sprich: return) kann ich nicht machen, da in dem moment u.U. ein blockingcall arbeitet (darf aber ruhig abgewürgt werden).

    Kann mir da jemand helfen?

    Euer ItsNotYou



  • Ist ja klar, das _endthreadex muss man dann ja im richtigen Thread aufrufen. Man kann ja da kein Thread-Handle oder sowas angeben.



  • und was gibt es sonst für (nicht allzu rabiate) methoden?



  • Die Threadfunktion "auslaufen lassen". Alles andere (außer _endthread(ex)) würgt ab und ist (laut Meinung diverser Experten) nicht ratsam.

    _endthread(ex) mußt Du in der Threadfunktion aufrufen.
    Rufst Du sie in Deiner "Haupt-"WndProc auf, beendet sie den Hauptthread (und was das heißt hast Du ja gesehen).



  • ItsNotYou schrieb:

    [...]zur selbstbeendung des threads (sprich: return) kann ich nicht machen, da in dem moment u.U. ein blockingcall arbeitet[...]

    was ist mit dem blockingcall, denn kann ich nicht übergehen (jedenfalls nicht meinesachtens und blocking sollte er schon bleiben).



  • Kannst du den blocking call evtl. mit einem Event verknüpfen?
    So, dass bei Aktivierung des Events der blocking call auch zurückkehrt.



  • Es geht doch bei dir um Sockets oder?
    Man könnte aus dem Hauptthread mit ioctlsocket den Socket in den Non-Blocking Modus versetzen. Ich weiß allerdings nicht ob bestehende blockende recv oder send Aufrufe abgebrochen werden.



  • wenn der thread in'nem socket recv() blockt, kann man auch von aussen den socket schliessen. dann kehrt recv() zurück, man fragt den rückgabewert ab (ist 0 wenn socket geschlossen wurde) und eventuell den errorstatus (errno oder WSAGetLastError()) und kann so erkennen, warum recv() zurückkam d.h. thread beenden oder nicht


Anmelden zum Antworten