Thread erzeugen.



  • So ich habe jetzt noch eine interessante Entdekcung gemacht :

    HANDLE hThread[2];
    
    	for (int i = 0; i < 2; i++)
    	{
    		threadLiga *sp = new threadLiga;
    		sp->pLiga = liga;
    		sp->iSpieltag = i + 1;
    
    		hThread[i] = CreateThread(NULL,0,test_thread,(void*)sp,0,NULL);
    
    	}
    
    	WaitForMultipleObjects(2,hThread, true,INFINITE);
    
    }
    
    // ==========================================
    
    DWORD WINAPI cVolleyballTrainer::test_thread(LPVOID pr)
    {
    	threadLiga *x = new threadLiga;
    	x->iSpielnummer = ((threadLiga*)pr)->iSpielnummer;
    	x->iSpieltag = ((threadLiga*)pr)->iSpieltag;
    	x->pLiga = ((threadLiga*)pr)->pLiga;
    
    	cout<<"Spieltag : "<<x->iSpieltag<<" ";
    
    	HANDLE hThread[5];
    	//cout<<x->iSpieltag<<"\n";
    	for (int i = 0; i < 5; i++)
    	{
    
    		threadLiga *temp = new threadLiga;
    		temp->iSpielnummer = i;
    		temp->iSpieltag = x->iSpieltag;
    		temp->pLiga = x->pLiga;
    
    		hThread[i] = CreateThread(NULL,0,Spiele_Match,(void*)temp,0,NULL);
    
    	}
    
    	WaitForMultipleObjects(5,hThread, true,INFINITE);	
    
    	return 1;
    }
    
    // ==========================================
    
    DWORD WINAPI cVolleyballTrainer::Spiele_Match(LPVOID pr)
    {
    	threadLiga *x = new threadLiga;
    	x->iSpielnummer = ((threadLiga*)pr)->iSpielnummer;
    	x->iSpieltag = ((threadLiga*)pr)->iSpieltag;
    	x->pLiga = ((threadLiga*)pr)->pLiga;
    
    	//cout<<x->pLiga->Get_Ansetzungen(x->iSpieltag)[x->iSpielnummer]->pHeim->Get_Name()<<" "<<x->pLiga->Get_Ansetzungen(x->iSpieltag)[x->iSpielnummer]->pGast->Get_Name()<<"\n";
    /*	try
    	{
    		cMatch *ma = new cMatch(x->pLiga->Get_Ansetzungen(x->iSpieltag)[x->iSpielnummer]);
    		x->pLiga->Set_Ergebnis(ma->Get_Ergebnis());
    		//delete ma;
    	}
    	catch(cException *ex)
    	{
    		cout<<ex->sError<<"\n";
    	}*/
    
    	cout<<"\n"<<x->iSpielnummer<<"\n";
    
    	return 1;
    }
    

    Wenn ich nur einen Thread starte (test_thread) dann geht alles . Starte ich jedeoch 2 oder mehr kommt es wieder zum fehler. Und nun habe ich nur ausgaben.



  • albert-einstein2 schrieb:

    Starte ich jedeoch 2 oder mehr kommt es wieder zum fehler.

    Wie oft soll ich noch fragen, welcher Fehler?



  • Ja . Tut mir leid.

    Momnet der Fehler taucht nicht mehr auf. Kann es einen UNterschied im Debuig und Release modeus geben . Verwende Visual Stuio 6.0



  • albert-einstein2 schrieb:

    Kann es einen UNterschied im Debuig und Release modeus geben .

    Klar, wenn du unsauber programmiert hast. Uninitialisierte Variablen, Arraygrenzenüberschreitungen, falsche oder fehlende Synchronisation.



  • Stop.
    Wenn man mehrere Thread erzeugt (18) dann kommt der Fehler .

    "Die Anweisung in 0x7c91142e verweist auf einen Speicher in 0x0000000 Der Vorgang read konnte nicht auf dem Speicher durchgeführt werden"



  • albert-einstein2 schrieb:

    "Die Anweisung in 0x7c91142e verweist auf einen Speicher in 0x0000000 Der Vorgang read konnte nicht auf dem Speicher durchgeführt werden"

    Sieht nach einem Nullzeiger aus. An welcher Stelle im Programm passiert das? Wie sieht der Callstack (Aufrufliste) aus?



  • Also meine Vermutung ist die , das die Angefordetern threasd nicht erzeugt werden könne, da nicht genug speicher zur verfügung steht, da vielleicht doch einige lekcs entsnaden sind.



  • Wie komme ich an diese Liste



  • albert-einstein2 schrieb:

    Also meine Vermutung ist die , das die Angefordetern threasd nicht erzeugt werden könne, da nicht genug speicher zur verfügung steht, da vielleicht doch einige lekcs entsnaden sind.

    Dann solltest du den Rückgabewert von CreateThread vielleicht mal prüfen.

    albert-einstein2 schrieb:

    Wie komme ich an diese Liste

    Im Debugger starten, bis zum Fehler laufen lassen, Alt + 7.



  • Der rückgabe wert von create threa ist immer eine speicheradresse



  • albert-einstein2 schrieb:

    Der rückgabe wert von create threa ist immer eine speicheradresse

    Unsinn.

    MSDN Library schrieb:

    Return Values
    If the function succeeds, the return value is a handle to the new thread.

    If the function fails, the return value is NULL. To get extended error information, call GetLastError.



  • Okay aber der Rückgabewert ist nicht null



  • FYI: Folgendes Programm läuft fehlerfrei durch. Natürlich sind die Ausgaben wild durcheinandergewürfelt, aber das war zu erwarten.

    #include <iostream>
    #include <windows.h>
    using namespace std;
    
    void* liga = NULL;
    
    struct threadLiga
    {
        void* pLiga;
        int iSpieltag;
        int iSpielnummer;
    };
    
    DWORD WINAPI test_thread(LPVOID pr) ;
    DWORD WINAPI Spiele_Match(LPVOID pr) ;
    
    int main()
    {    
        HANDLE hThread[2]; 
        for (int i = 0; i < 2; i++) 
        { 
            threadLiga *sp = new threadLiga; 
            sp->pLiga = liga; 
            sp->iSpieltag = i + 1; 
            hThread[i] = CreateThread(NULL,0,test_thread,(void*)sp,0,NULL); 
        } 
    
        WaitForMultipleObjects(2,hThread, true,INFINITE); 
    } 
    
    DWORD WINAPI test_thread(LPVOID pr) 
    { 
        threadLiga *x = new threadLiga; 
        x->iSpielnummer = ((threadLiga*)pr)->iSpielnummer; 
        x->iSpieltag = ((threadLiga*)pr)->iSpieltag; 
        x->pLiga = ((threadLiga*)pr)->pLiga; 
    
        cout<<"Spieltag : "<<x->iSpieltag<<" "; 
    
        HANDLE hThread[5]; 
        for (int i = 0; i < 5; i++) 
        { 
            threadLiga *temp = new threadLiga; 
            temp->iSpielnummer = i; 
            temp->iSpieltag = x->iSpieltag; 
            temp->pLiga = x->pLiga; 
            hThread[i] = CreateThread(NULL,0,Spiele_Match,(void*)temp,0,NULL); 
        } 
        WaitForMultipleObjects(5,hThread, true,INFINITE);    
        return 1; 
    } 
    
    DWORD WINAPI Spiele_Match(LPVOID pr) 
    { 
        threadLiga *x = new threadLiga; 
        x->iSpielnummer = ((threadLiga*)pr)->iSpielnummer; 
        x->iSpieltag = ((threadLiga*)pr)->iSpieltag; 
        x->pLiga = ((threadLiga*)pr)->pLiga; 
        cout<<"\n"<<x->iSpielnummer<<"\n"; 
        return 1; 
    }
    


  • wie kann man eigeltich den debugger starten und gibt es eine möglichkleit speicherlecks zu finden


  • Administrator

    albert-einstein2 schrieb:

    Verwende Visual Stuio 6.0

    Bevor du lernst den Debugger zu starten, empfehle ich ein Umstieg auf einen aktuelleren Compiler. Nimm zum Beispiel Microsoft Visual Studio 2008 Express Edition oder Code::Blocks. VC6 ist mehr als 10 Jahre alt und definitiv veraltet.

    Grüssli



  • Cool Danke für deine unermüdliche Hilfe.
    Werde mal sehen ob ich einen aktuellen Comppiler rankriege. Lassen sich den nmit einem Debugger Speicherlecks finden ??
    Oder wiegeht man da vor



  • MFK schrieb:

    FYI: Folgendes Programm läuft fehlerfrei durch. Natürlich sind die Ausgaben wild durcheinandergewürfelt, aber das war zu erwarten.

    #include <iostream>
    #include <windows.h>
    using namespace std;
    
    void* liga = NULL;
    
    struct threadLiga
    {
        void* pLiga;
        int iSpieltag;
        int iSpielnummer;
    };
    
    DWORD WINAPI test_thread(LPVOID pr) ;
    DWORD WINAPI Spiele_Match(LPVOID pr) ;
    
    int main()
    {    
        HANDLE hThread[2]; 
        for (int i = 0; i < 2; i++) 
        { 
            threadLiga *sp = new threadLiga; 
            sp->pLiga = liga; 
            sp->iSpieltag = i + 1; 
            hThread[i] = CreateThread(NULL,0,test_thread,(void*)sp,0,NULL); 
        } 
    
        WaitForMultipleObjects(2,hThread, true,INFINITE); 
    } 
    
    DWORD WINAPI test_thread(LPVOID pr) 
    { 
        threadLiga *x = new threadLiga; 
        x->iSpielnummer = ((threadLiga*)pr)->iSpielnummer; 
        x->iSpieltag = ((threadLiga*)pr)->iSpieltag; 
        x->pLiga = ((threadLiga*)pr)->pLiga; 
    
        cout<<"Spieltag : "<<x->iSpieltag<<" "; 
        
        HANDLE hThread[5]; 
        for (int i = 0; i < 5; i++) 
        { 
            threadLiga *temp = new threadLiga; 
            temp->iSpielnummer = i; 
            temp->iSpieltag = x->iSpieltag; 
            temp->pLiga = x->pLiga; 
            hThread[i] = CreateThread(NULL,0,Spiele_Match,(void*)temp,0,NULL); 
        } 
        WaitForMultipleObjects(5,hThread, true,INFINITE);    
        return 1; 
    } 
    
    DWORD WINAPI Spiele_Match(LPVOID pr) 
    { 
        threadLiga *x = new threadLiga; 
        x->iSpielnummer = ((threadLiga*)pr)->iSpielnummer; 
        x->iSpieltag = ((threadLiga*)pr)->iSpieltag; 
        x->pLiga = ((threadLiga*)pr)->pLiga; 
        cout<<"\n"<<x->iSpielnummer<<"\n"; 
        return 1; 
    }
    

    Hast du das Program auch mal mit mehr als 2 threads ausprobiert.

    also ich brauch 18



  • Also ich habe jetzt deinen Code bei mir laufen lassen.

    DAs bedeutet ich habe die beiden Thread Funktionen kopiert und den AUfruf. aber icherhalte weiterhin diesen doofen fehler.
    Dasprogram macht wirklich nicht mehr,

    int main()
    {
    	try
    	{
    		cVolleyballTrainer *trainer = new cVolleyballTrainer("test");
    	}
    	catch(cException *ex)
    	{
    		cout<<ex->sError;
    	}
    	return 0;
    
    }
    
    // ==========================================
    
    cVolleyballTrainer::cVolleyballTrainer(string odbc)
    {
    	srand(time(NULL));	
    
    	Neues_Spiel();
    }
    
    // ==========================================
    
    void cVolleyballTrainer::Neues_Spiel()
    {	
    	void* liga = NULL;
    
    	HANDLE hThread[2];
        for (int i = 0; i < 2; i++)
        {
            threadLiga *sp = new threadLiga;
            sp->pLiga = NULL;
            sp->iSpieltag = i + 1;
            hThread[i] = CreateThread(NULL,0,test_thread,(void*)sp,0,NULL);
        }
    
        WaitForMultipleObjects(2,hThread, true,INFINITE); 
    
    }
    
    // ==========================================
    
    DWORD WINAPI cVolleyballTrainer::test_thread(LPVOID pr)
    {
        threadLiga *x = new threadLiga;
        x->iSpielnummer = ((threadLiga*)pr)->iSpielnummer;
        x->iSpieltag = ((threadLiga*)pr)->iSpieltag;
        x->pLiga = ((threadLiga*)pr)->pLiga;
    
        cout<<"Spieltag : "<<x->iSpieltag<<" ";
    
        HANDLE hThread[5];
        for (int i = 0; i < 5; i++)
        {
            threadLiga *temp = new threadLiga;
            temp->iSpielnummer = i;
            temp->iSpieltag = x->iSpieltag;
            temp->pLiga = x->pLiga;
            hThread[i] = CreateThread(NULL,0,Spiele_Match,(void*)temp,0,NULL);
        }
        WaitForMultipleObjects(5,hThread, true,INFINITE);    
        return 1; 
    	return 1;
    }
    
    // ==========================================
    
    DWORD WINAPI cVolleyballTrainer::Spiele_Match(LPVOID pr)
    {
    	threadLiga *x = new threadLiga;
        x->iSpielnummer = ((threadLiga*)pr)->iSpielnummer;
        x->iSpieltag = ((threadLiga*)pr)->iSpieltag;
        x->pLiga = ((threadLiga*)pr)->pLiga;
        cout<<"\n"<<x->iSpielnummer<<"\n";
        return 1; 
    }
    
    // ==========================================
    

    Sehr komisch



  • Ich habe den gezeigten Code in ein neues Projekt kopiert, läuft einwandfrei.

    EDIT: Auch mit 18 * 5 Threads.

    Zeig bitte ein vollständiges, kompilierbares Minimalbeispiel, das den Fehler reproduziert.



  • Ich habe das bei mir auch in ein neues Projekt kopeirt
    WIN32 anwednugn und visul stuio 6 kann es damit vilelleicht zusammen hängen


Anmelden zum Antworten