Laufende Thread beenden??



  • folgender code:

    UINT CControl::ThreadFunc(LPVOID Data){
    
        threadPara *back = (threadPara*)Data;
    
    	CStatic *p = (CStatic*) back->pInstance->GetDlgItem(IDC_STATIC);
    
    	CString str="Thread Iteration: ";
    	int i=0;
    	while(1){
    
    		str.Format("%i",i++);
    		p->SetWindowText(str);
    	}
    
    	return 0;
    } 
    
    void CControl::startThread(){
    
    	param->a=0;
    	param->b='a';
    	param->pInstance=this;
    	int i=0;
    	index=&i;
    	if(pThread==NULL)
    		pThread= AfxBeginThread(CControl::ThreadFunc,(LPVOID)param);
    	//hThread= CreateThread( NULL,0,CControl::ThreadFunc,(LPVOID)param,0,&dwThread); 
    
    }
    

    wie kann ich nun diese Thread über den CWinThread Pointer löschen bzw. beenden



  • Du sagst dem Thread, dass er sich beenden soll!
    Z.B. via

    beendeDich = true;
    

    . und im Thread:

    while(beendeDich == false){
        str.Format("%i",i++);
        p->SetWindowText(str);
      }
    


  • TerminateThread (pThread->m_hThread);
    🙂



  • ten schrieb:

    TerminateThread (pThread->m_hThread);
    🙂

    Das ist wohl nicht Dein Ernst, oder???

    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



  • Jochen Kalmbach schrieb:

    ten schrieb:

    TerminateThread (pThread->m_hThread);
    🙂

    Das ist wohl nicht Dein Ernst, oder???

    nicht ganz 😉
    aber ich dachte mir
    str.Format("%i",i++);
    und
    p->SetWindowText(str);
    können nix schlimmes machen.
    sollte man vielleicht mal ausprobieren ob 'TermiateThread' in dem fall üble folgen hat...



  • ten schrieb:

    aber ich dachte mir
    p->SetWindowText(str);
    können nix schlimmes machen.

    Vermutlich würde es gehen... ABER: Hat irgendjemand einen Hook installiert oder das OS ändert sein verhalten, sieht die ganze Sache vielleicht wieder ganz anders aus!
    Deshalb: NIE Terminate/SuspendThread verwenden!



  • Jochen Kalmbach schrieb:

    NIE Terminate/SuspendThread verwenden!

    es sei denn, man hat 'nen thread, der nur etwas berechnet, ohne jemals eine winapi- oder library-funktion aufzurufen...



  • Jochen Kalmbach schrieb:

    NIE Terminate/SuspendThread verwenden!

    es sei denn, man hat 'nen thread, der nur etwas berechnet, ohne jemals eine winapi- oder library-funktion aufzurufen...

    Naja...wenn der Thread Daten auf den Heap schaufelt, dann haste u.U. nette Memory Leaks, wenn Du TerminateThread aufrufst.

    Der Poster greift in seinem Thread auf GUI-Controls zu.

    p->SetWindowText(str);

    Das tut in den Augen weh und gehört verboten. Veränderungen an GUI-Komponenten immer mit PostMessage realisieren. Ausführliche Begründungen gibst wie immer bei Google.



  • wie kann ich über kontrols zugriefen mit postmessage?



  • Dies geschieht über Messages. Du kannst als Programmierer eigene Messagetypen definieren. Dein Haupt-Thread muss diese Message dann verarbeiten, um die GUI zu aktualisieren. Mit PostMessage versendet du dann deine selbstdefinierten Message asynchron aus deinem Workerthread heraus.

    Guck dir Progressbar-Artikel bei www.codeproject.com an.
    Bei Progressbars hast du auch die Situation, dass ein WorkerThread die GUI aktualisieren muss. Den ganzen Code mit Erklärungen kann ich hier nicht auf die Schnelle mal reinposten, zumal wurde das Thema schon mehrfach abgehandelt.

    Lies viel über nebenläufige Programmierung in C++. Das ist extrem wichtig, wenn du stabilen Code erzeugen willst. Das fiese an Threadprogrammierung ist, dass Fehler oft nicht zu reproduzieren sind. In 99,5% aller Fälle geht alles gut. Doch irgendwann kracht es oder zu hast nen Deadlock und du fragst dich wo zum Teufel dieser Crash verursacht wird. Die Suche nach solchen Fehler kann dich wochenlang beschäftigen.



  • DreiZweiEins schrieb:

    Dies geschieht über Messages. Du kannst als Programmierer eigene Messagetypen definieren. Dein Haupt-Thread muss diese Message dann verarbeiten, um die GUI zu aktualisieren. Mit PostMessage versendet du dann deine selbstdefinierten Message asynchron aus deinem Workerthread heraus.

    Guck dir Progressbar-Artikel bei www.codeproject.com an.
    Bei Progressbars hast du auch die Situation, dass ein WorkerThread die GUI aktualisieren muss. Den ganzen Code mit Erklärungen kann ich hier nicht auf die Schnelle mal reinposten, zumal wurde das Thema schon mehrfach abgehandelt.

    Lies viel über nebenläufige Programmierung in C++. Das ist extrem wichtig, wenn du stabilen Code erzeugen willst. Das fiese an Threadprogrammierung ist, dass Fehler oft nicht zu reproduzieren sind. In 99,5% aller Fälle geht alles gut. Doch irgendwann kracht es oder zu hast nen Deadlock und du fragst dich wo zum Teufel dieser Crash verursacht wird. Die Suche nach solchen Fehler kann dich wochenlang beschäftigen.

    👍
    Threads sind Die Hölle (tm).
    Das fieseste daran ist IMHO dass man erst merkt dass man nicht viel über Multithreading weiss, wenn man bereits viel mehr als der Durchschnittsprogrammierer über Multithreading weiss 🙂
    Oder anders gesagt: dass Leute die sich mit Multithreading nicht so auskennen oftmals glauben sie wüssten was sie tun. Was dann meistens ein Irrglaube ist.



  • ja ist ich weis hab schon oft gehört "vergiss threads, machs über timer"..

    aber ich will mich trozdem mal beschäftigen.. will 2 thread haben, und eine daten klasse... mit einem thread will ich die daten verändern (daten klasse) und mit dem andere trhead gleichzeitig die daten anzeigen bzw. lesen...

    vll. habt ihr ja schon bischen erfahrung und beispiel code



  • hustbaer schrieb:

    Threads sind Die Hölle (tm).
    Das fieseste daran ist IMHO dass man erst merkt dass man nicht viel über Multithreading weiss, wenn man bereits viel mehr als der Durchschnittsprogrammierer über Multithreading weiss 🙂
    Oder anders gesagt: dass Leute die sich mit Multithreading nicht so auskennen oftmals glauben sie wüssten was sie tun. Was dann meistens ein Irrglaube ist.

    jetzt übertreibst du aber....



  • wech: weil kein MFC



  • zhoosch, das tut echt in den Augen weh.
    Wenn du schon so einen Mist postest, dann schreib drüber, dass es Mist ist.



  • @zhoosch: Mein Beitrag auf Seite 1 hast Du wohl übersehen... Also nochmals für Dich: "Never ever use TerminateThread"!



  • DreiZweiEins schrieb:

    Der Poster greift in seinem Thread auf GUI-Controls zu.

    p->SetWindowText(str);

    Das tut in den Augen weh und gehört verboten. Veränderungen an GUI-Komponenten immer mit PostMessage realisieren. Ausführliche Begründungen gibst wie immer bei Google.

    Nun, da bin ich, auch wenn es unkonventionell erscheinen mag, durchaus anderer Meinung. Auch ich habe mal brav mit PostMessage(..) gearbeitet. Allerdings ist diese Funktion u.U. unzuverlässig und es geht schon mal die ein oder andere Nachricht, die via PostMessage(..) gesendet wurde, "verloren" 😞 . Bei kritischen Anwendungen, die wirklich alle Informationen aus einem Thread benötigen, ist das schon mal nicht sehr gut!
    Es geht auch ein SendMessage(..) oder eben auch ein direkter Zugriff. Natürlich immer unter der Voraussetzung, dass das ganze Projekt so implementiert ist, dass es sauber synchronisiert läuft und keine dead-locks erzeugt.
    Allerdings, darauf habe ich auch schon das ein oder andere mal hingewiesen, niemals ein CWnd oder davon abgeleitetes Objekt direkt an einen Thread übergeben und dort verwenden!
    Warum? Ich wiederhole:
    CWnd sind nicht thread-save! Darauf wird im MSDN immer wieder hingewiesen! Statdessen den HWND des Windows and den Thread übergeben, und mit CWnd::FromHandle( hWnd ) das CWnd objekt holen. Dann lässt sich damit prima arbeiten.

    Gruss, Gio



  • zhoosch schrieb:

    wech: weil kein MFC

    besser ist das.
    wär mir auch peinlich gewesen 😃



  • ten schrieb:

    hustbaer schrieb:

    Threads sind Die Hölle (tm).
    Das fieseste daran ist IMHO dass man erst merkt dass man nicht viel über Multithreading weiss, wenn man bereits viel mehr als der Durchschnittsprogrammierer über Multithreading weiss 🙂
    Oder anders gesagt: dass Leute die sich mit Multithreading nicht so auskennen oftmals glauben sie wüssten was sie tun. Was dann meistens ein Irrglaube ist.

    jetzt übertreibst du aber....

    Nö, tu' ich glaube ich nicht. 🙂



  • ok ich hab verstanden, ich muss das CWnd Objekt immer über das HWND holen.

    was ist denn besser? wenn ich dann mit dem CWnd Objekt arbeite und Controls verarbeite, oder über PostMessage??

    Was ist der Unterschied zwischen PostMessage und SendMessage?


Anmelden zum Antworten