Problem mit Thread und Steuerelement



  • Morgen,

    ich habe mir einen Arbeitsthread erstellt, der ein Steuerelement mit Werten füllen soll.

    //Header

    static UINT AnzeigeAktualisieren(LPVOID pParam);
    BOOL abbruch;
    BOOL threadstart;
    DWORD ExitCode;
    CWinThread* thread;
    int itemNr;
    LV_ITEM item;
    

    //CPP Datei

    //Steht in der OnInitDialog = Threadstart
    this->thread = AfxBeginThread(AnzeigeAktualisieren,this,THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
    if ( this->thread != NULL )
    {
    	this->thread->m_bAutoDelete = FALSE;
    	this->thread->ResumeThread();
    }
    
    //Dies ist mein Thread
    //Bitte kommentierte Zeile anschauen; dort geht er rein und kommt net mehr raus wenn ich auf abbruch gedrückt habe
    UINT Auswahl::AnzeigeAktualisieren(void *pParam)
    {
    	Auswahl* lpouterThis = (Auswahl*) pParam;
    	lpouterThis->threadstart = TRUE;
    	lpouterThis->GetDlgItem(IDC_Abbruch)->EnableWindow(TRUE);
    
    	lpouterThis->item.mask = LVIF_TEXT;
    	//MySQL Ergebis holen
    	while(Ergebnismenge != NULL)
    	{
    		for (int i = 0; i < Spaltenanzahl; i++)
    		{
    			lpouterThis->item.iItem = 0;
    			lpouterThis->item.pszText = row[i];
    			lpouterThis->item.iSubItem = 0;
    			//Hier Fehler
    			lpouterThis->itemNr = lpouterThis->m_CBenutzer.InsertItem(&lpouterThis->item);
     			for ( int y = 1; y <= 5; y++ )
    			{
    				i++;
    				lpouterThis->item.iItem = lpouterThis->itemNr;
    				lpouterThis->item.iSubItem = y;
    				lpouterThis->item.pszText = row[i];
                                  lpouterThis->m_CBenutzer.SetItem(&lpouterThis->item);  //Hier geht er rein und macht nich weiter, wenn abbruch = TRUE ist
    			}
    			if ( lpouterThis->abbruch )
    				break;
    		}
    		if ( lpouterThis->abbruch )
    			break;
    	}
    	//MySQL Ergebnis freigeben
    	AfxEndThread(1,TRUE);
    	return 0;
    }
    
    //Mein Abbruch Button
    this->abbruch = TRUE;
    	if ( this->threadstart )
    	{
    		while(WaitForSingleObject(this->thread->m_hThread, INFINITE) != WAIT_OBJECT_0);
    		GetExitCodeThread(this->thread->m_hThread,&ExitCode);
    		delete this->thread;
    		if(ExitCode == 1)
    		{
    			MessageBox("Ok",NULL,MB_OK);
    		}
    	}
    

    Soweit funktioniert ja auch alles wunderbar, bis ich meinen schönen Button "Abbruch" drücke.

    Ich habe schon debugt ohne ende und das Ergebnis ist, dass er den Thread auch wunderbar weiterführt, when "waitForSingleObjekt" aufgerufen wird.

    Aber sobald er an die Stelle kommt, wo er das Item setzten soll (SetItem), geht er da rein und kommt aus dieser Methode nicht wieder raus.

    Wenn ich diese Zeile auskommentiere und auf "Abbruch" drücke, funktioniert alles wunderbar.

    Wo hat er dort den Fehler? Ich habs auch schonmal mit DeleteItem o.ä. versucht. Leider das gleiche Ergebnis.

    m_cBenuter ist vom Typ CListCtrl

    Ich habe echt keine Ahnung, warum er das nicht macht. Das komische daran ist aber, dass das Problem, wie gesagt, erst auftritt, wenn ich "Abbrch" drücke. Vorher führt er die Methode ohne Probleme aus.


Anmelden zum Antworten