Mehrere Instanzen eines ThreadObjects ... Anzahl dynamisch festlegen
-
Hi,
ich brauche auch mal wieder Hilfe.Ich möchte eine unbestimmte Anzahl an Threads erzeugen.
Die Anzahl ergibt sich erst während der laufzeit.
Ich habe es so probiert :
TJoinerThread *Lister[ServerListe->Count]; //<-- Hier bekomme ich den Fehler int i=0; for(i;i<ServerListe->Count;i++) { Lister[i] = new TJoinerThread(false,lvGame->Items->Item[i],i); Lister[i]->FreeOnTerminate = true; }Der Fehler besagt das ich einen Constantenwert angeben soll.
Da ich aber vorher nicht weiss wiviele Threads ich haben muss, geht das nicht.Alles was ich zu meinem Problem mit der Suche finden konnte war:
http://www.c-plusplus.net/forum/viewtopic.php?t=48979&highlight=tthread
Allerdings gabs da keine Lösung als Antwort.
-
Den FAQ-Beitrag zu dynamischen Arrays kennst du?
-
Danke Jansen, genau den Anstoß habe ich gebraucht.
ich habe zwar in die FAQ geschaut, allerdings habe ich dort eher nach Thread einträgen geschaut und diesen dann wohl überlesen.
-
Ok dein Fingerzeig auf die FAQ hat mir ein ganzes Stück weitergeholfen.
Allerdings scheint es noch ein Problem mit den Threads zu geben.
Kann es sein das Windows pro Application nur eine bestimmte Menge an Threads anlegen/Verwalten kann ?
Oder kann es sein dass sich meine Threadds zu schnell wieder beenden ?
Wie muss ich eigentlich die Threads wieder freigeben ?
Hier mal mein Code wie ich die Threads anlege.
thrdArray.Length = ServerListe->Count; //Anzahl kann mehrer 100 enthalten int i=0; for(i;i<thrdArray.Length;i++) { thrdArray[i] = new TJoinerThread(false,lvGameSpy->Items->Item[i],i); thrdArray[i]->FreeOnTerminate = true; } /* Beim freigeben habe ich bis jetzt nur die Lenght eEigenschaft des Array auf 0 gesetzt. Ich habe es auch schon mit einer Schleife versucht, aber da ich meine Threads mit FreeOnTerminate aufrufe habe ich mir gedacht, laut Hilfe werden die Objecte dann selbstständig wieder freigegeben. */Ich habe auch folgende version beim Aufruf probiert :
thrdArray.Length = ServerListe->Count; int i=0; for(i;i<thrdArray.Length;i++) { thrdArray[i] = new TJoinerThread(true,lvGameSpy->Items->Item[i],i); thrdArray[i]->FreeOnTerminate = true; thrdArray[i]->Resume(); }Ich habe auch schon innerhalb des Threads den Code so stark auskommentiert das der praktisch nichts mehr macht um Fehler auszuschliessen.
Ich erhalte aber trotzdem noch den Fehler EInvalidPointer. Aber das nicht gleich am Anfang sondern irgendwo mittendrinne.
Vielleicht kann mir jemand nochmal nen Tipp geben.
Edit : ich habe nochmal die Anzahl der Threads stark Reduziert und sogut wie keinen Code mehr der im Thread ausgeführt wird.Trotzdem erhalte ich immernoch diesen fehler.
Eine weitere möglichkeit die ich noch nach weiteren probieren gefunden habe ist das wenn sich einer der Threads beendet hat das der nächste Thread dann einen falschen Pointer hat da ich die Anzahl meiner Threads jétzt sehr stark reduziert habe, auf 5. Kommt mir dieser Verdacht.
Und es tritt immer noch eine AccessViolation beim beenden des Programms auf.
Meine Execute Funktion :
void __fastcall TJoinerThread::Execute() { //---- Hier den Thread-Code plazieren---- char Buff[20]; Buff[0]=0; int Size, lenght; AnsiString Cmd; bool Send = false; while(Terminated == false) { if(!Send) { strcpy(Buff, "\\status\\"); Size = sizeof(Buff); lenght = strlen(Buff); UDP->RemoteHost = Ip; UDP->RemotePort = Port; UDP->LocalPort = 1234 + ThrdIndex; UDP->SendBuffer(Buff,Size ,lenght ); // Timer->Enabled = true; Send = true; } else if(Terminated == false && Send == true); { // this->Terminate(); // this->Terminated = true; Application->ProcessMessages(); // Sleep(200); } } if(Terminated) DEAD = true; } //---------------------------------------------------------------------------Ansonsten habe ich nur noch eine Funktion um auf DataReceive der UDP Komponete zu reagieren. Dort mache ich aber nichts mehr als Terminate() aufzurufen.
Edit2:
Ich habe jetzt nochmeh Code entfernt und nur noch 2 Zeilen die eigentlich ausgeführt werden den rest habe ich komplett aukommentiert.Ich habe noch einwenig mit der Anzahl eperimetiert.
Von 1-3 habe ich keine Meldungen mehr auch nicht beim beenden sobal die auf 4 erhöhe kommt wieder der EInvalidPointer Fehler.