Thread erzeugen.
-
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
-
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
-
#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; }Das ist mein Beispiel
== deins
-
Welches Service Pack von VC6?
-
1. Speicherlecks werden normalerweise beim Beenden des programmes ausgegeben. Siehe auch Doku zu DEBUG_NEW
2. Mal grundsätzlich: Wo sind eigentlich Deine CloseHandle?
3. Ist Deine Verwednung von CreateThread nicht korrekt, da Du die CRT benutzt. Du musst _beginthreadex verwenden (siehe früheres Posting)
4. Erzeugst Du munter Speicher, aber hast Du auch Regeln wer wann welchen Speicher entsorgen darf?
5. Warum allokierst Du selbst für eine Ausgabe einen neuen Speicherblock, wenn Du direkt mit dem Zeiger auf die daten auch zugreifen kannst?
-
MFK schrieb:
Welches Service Pack von VC6?
Ich habe das ghleich Projekt mal auf einem anderen rechner ausgeführt und da geht es . Ich kann das nicht nachvollziehen
-
Okay< ich ahbe einfach nioch mal das Studio neu gestartet und dann hat es funktioniert.
Ich echt merkwürdig.
-
Steig doch einfach mal auf eine nicht total veraltete Entwicklungsumgebung um.
-
Da hast du recht-
Kannst du was empfehlen. ALso ich ahbe auch noch Borland c++ Builder 6.
-
Also ich könnte dir Code::Blocks empfehlen.
PS: Schau mal ein paar Posts hoch