Thread erzeugen.
-
Weil es 1. zu lange dauert. Und 2. Ich etwas lernen möchte.
// ========================================== DWORD WINAPI cVolleyballTrainer::Spiele_Match(LPVOID data) { 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"; } return 1; }Wäre das so besser.
Also mit dem Speicherlecks und dem Freigeben ?
Vielen Dank
-
albert-einstein2 schrieb:
Weil es 1. zu lange dauert. Und 2. Ich etwas lernen möchte.
Wenn du von mehreren Fragen immer nur eine beantwortest, kommen wir nicht weiter.
Und ganz nebenbei, durch Threads wird dein Programm nicht unbedingt schneller.
-
Ich denke schon. Da ja viele Objecte gleichzeit uasgeführet werden.
Also Get_Ansetzung liefert einen Zeiger zurück bestehend aus den Ansetzungen für den jeweiligen Spieltag.
-
albert-einstein2 schrieb:
Ich denke schon. Da ja viele Objecte gleichzeit uasgeführet werden.
Ein Prozessorkern kann nicht mehrere Dinge gleichzeitig ausführen. Es wird immer wieder zwischen Threads hin- und hergeschaltet.
albert-einstein2 schrieb:
Also Get_Ansetzung liefert einen Zeiger zurück bestehend aus den Ansetzungen für den jeweiligen Spieltag.
Ja, damit kann man nun gar nichts anfangen. Machst du da etwas, das synchronisiert werden müsste?
Und die Frage, welche Exception geworfen wird, und an welcher Stelle, hast du immer noch nicht beantwortet.
Und wenn du dein cMatch-Objekt sowieso gleich wieder freigibst, dann leg es doch bitte auf dem Stack an, nicht mit new.
-
Okay da hast natürlich Recht. Ich besitze aber einen Rechner mit mehrerer Kernen und da (so denke ich 9 ist ein UNterschied schon zu spüren. Außerdem bekommt eine Anwendung mehr Rechenzeit je mehr Prozesse sie laufen hat. Also selbst auf einem Single Kern Porzessor hast du einen Unterschied. Aber darum geht es huier ja nicht.
Also die beiden Funktionen brauchen nicht synchronisiert werden. Ihc habe mal zum testen den Aufruf von cMatch rausgenbommen, und das gleiche bild geshen . also liegt der fehler woanders. ich habe die vermutung das das beenden der thread nicht so richtig klappt.
gibt es da noch eine andere alternavtive ( funktion ) auf das ende eines threads zu warten
-
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
-
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