Thread wie geht das?



  • Wie geht das mit den Threads eigentlich richtig?

    Aufruf:

    DWORD id;
    ::CreateThread(0, NULL, (LPTHREAD_START_ROUTINE)testit, (LPVOID)0, NULL, &id);
    

    Funktion:

    DWORD MyTest::testit(LPVOID)
    {
    //...
    	return 0;
    }
    

    'Typumwandlung': 'overloaded-function' kann nicht in 'LPTHREAD_START_ROUTINE' konvertiert werden



  • class MyTest
    {
        static DWORD WINAPI testit(LPVOID)
        {
            //...
            return 0;
        }
    


  • Und die unnötigen "casts" würde ich weglassen; das deutet meistens daraufhin, das man was falsch gemacht hat...



  • Hallo und Dankeschön für die prompte Antwort 👍

    Wie beende ich nun eigentlich den Thread sauber?
    Mit ExitThread vermute ich. Nur wie identifiziere
    ich den zu beendenden Thread?

    Im Beispiel ist es ja "id", aber jeder Aufruf mit
    ExitThread beendet sofort meine ganze Anwendung 🙄



  • ExitThread beendet immer den aktuellen Thread (in dem die Funktion aufgerufen wird). Schau dir mal TerminateThread an der kannst du einen Handle und einen Exit-Code (also wie bei ExitThread übergeben).

    EDIT vertipper, klammer zu 😉



  • CodeFinder schrieb:

    TerminateThread

    Diese Funktion sollte man nie aufrufen!
    Siehe: Why you should never call Suspend/TerminateThread (Part I-III)
    http://blog.kalmbachnet.de/?postid=6
    http://blog.kalmbachnet.de/?postid=16
    http://blog.kalmbachnet.de/?postid=17



  • Thr schrieb:

    Wie beende ich nun eigentlich den Thread sauber?

    Am einfachsten, indem Du aus dem Thread mit "return" rausgehst...

    Du solltest aber den Thread nicht mit "CreateThread" sondern mit _beginthread(ex) erstellen! Oder Du stellst sicher, dass Du *keine* CRT Funktionen in denm Thread verwendest, dann kannst Du auch CreateThread verwenden.
    Falls Du doch CRT-Funktionen verwenden solltest, entstehts sonst ein Speicherleck.
    Oder Du beendest den Thread mittels _endthread(ex); dann passt es auch wieder...



  • Also mit _beginthread(ex) kann ich irgendwie nicht um...

    Gibts dazu hier im Forum keine Beispiele? Habe zumindest in der
    Forensuche nichts gefunden.

    Ist es nun einfach nur unfein das auf die andere Art zu machen,
    sofern man diese speziellen CRT nicht nutzt, oder auch sonst grundsätzlich ernsthaft bedenklich?

    Wie machens die Leute sonst hier im Forum?

    Dank und Gruß
    Thr



  • Es ist ernsthaft bedenklich, einen anderen als den eigenen Thread zu beenden. Du weißt nicht, welchen Code der andere Thread gerade ausführt und welche gemeinsam genutzten Objekte er manipuliert. Wenn du einen anderen Thread beendest, werden seine WaitHandles freigegeben und er hinterlässt unter Umständen ein Objekt, dass sich in einem inkosistenten Zustand befindet, was dann von anderen Threads so genutzt wird.

    Es gibt keine Möglichkeit, dieses Problem zu verhindern, außer indem sich jeder Thread selbst beendet.



  • Jochen Kalmbach schrieb:

    Du solltest aber den Thread nicht mit "CreateThread" sondern mit _beginthread(ex) erstellen! Oder Du stellst sicher, dass Du *keine* CRT Funktionen in denm Thread verwendest, dann kannst Du auch CreateThread verwenden.
    Falls Du doch CRT-Funktionen verwenden solltest, entstehts sonst ein Speicherleck.
    Oder Du beendest den Thread mittels _endthread(ex); dann passt es auch wieder...

    Wann entstehen Speicherlecks? Mit welchen CRT Funktionen entstehen die und wieso? 😕



  • Kann mir bitte jemand ein Beispiel für beginthread geben?
    Ich versuche damit verzweifelt ne Funktion aufzurufen...



  • Jochen Kalmbach schrieb:

    CodeFinder schrieb:

    TerminateThread

    Diese Funktion sollte man nie aufrufen!
    Siehe: Why you should never call Suspend/TerminateThread (Part I-III)
    http://blog.kalmbachnet.de/?postid=6
    http://blog.kalmbachnet.de/?postid=16
    http://blog.kalmbachnet.de/?postid=17

    Ich weiß, das is dirty... alá "Prozessstruktur beenden" im TaskMgn...aber damit kann er ihn beenden 😃



  • Thr schrieb:

    Kann mir bitte jemand ein Beispiel für beginthread geben?
    Ich versuche damit verzweifelt ne Funktion aufzurufen...

    Das ist doch wohl lachhaft. Benutz google oder koders.com um Beispiele zu finden. Alternativ könntest du auch programmieren lernen.



  • Ich dachte das Forum wäre auch Newbie-freundlich, darum habe ich das
    hier gepostet. Entschuldigt, falls das hier nicht hingehört.
    Ich habe erst mit C++ angefangen (vor knapp 2 Wochen). 🙂

    Mir ist daher nicht so ganz klar wie ich beginthread verwenden soll.
    Besonders, wenn ich eine einfache void-Funktion damit aufrufen will.

    Muss man aber wohl mit Pointern innerhalb der Funktion arbeiten oder?



  • Thr schrieb:

    Kann mir bitte jemand ein Beispiel für beginthread geben?
    Ich versuche damit verzweifelt ne Funktion aufzurufen...

    Jop, hier: http://msdn2.microsoft.com/en-us/library/kdzttdcb.aspx



  • Hallo Codefinder!

    Ich kann damit also keine void-Funktion aufrufen richtig?

    _beginthread(lesson5, 0, 1); //lesson5 ist = void lesson5(void)
    

    '_beginthread': Konvertierung des Parameters 1 von 'void (void)' in 'void (__cdecl *)(void *)' nicht möglich

    Start address of a routine that begins execution of a new thread. For _beginthread, the calling convention is either __cdecl or __clrcall; for _beginthreadex, it is either __stdcall or __clrcall.

    Alles noch etwas böhmische Dörfer 🙄



  • Der Prototyp müsste:

    void __cdecl ThreadProc( void* pvData )
    

    sein.

    EDIT: was vergessen ("__cdecl")



  • hmm, ändert nichts an der Meldung. Ich verstehs net.



  • siehe EDIT, sorry



  • Ich fasse mal zusammen:

    Der Aufruf:

    _beginthread(ThreadProc,0,1);
    

    Die Funktion die gerufen wird:

    *.h

    void __cdecl ThreadProc( void* pvData );
    

    *.cpp

    void __cdecl ThreadProc( void* pvData )
    {
    MessageBox(0,"angekommen!",0,0);
    
    }
    

    Und das läuft bei dir 😕 Bei mir liegt wohl der Fehler im
    ersten Parameter vom Aufruf oder?


Anmelden zum Antworten