(C++) speicherproblem bei thread
-
hallo, ich hab ein problem ich habe folgenden quellcode geschrieben, der eine ca. 24000 zeilige datei in einem thread bearbeitet und ein element jeder zeile in einer multimap speichert. das problem (eine eOutOfMemory exception) tritt erst auf seitdem ich es in einen thread gepackt habe, zumindest scheint es so. hier der quellcode:
void DoCopy(void* vparam) { TForm1* MyFrm=(TForm1*)vparam; multimap <long, AnsiString> Router, Datum, Zeit; multimap <long, AnsiString> :: iterator pIter, Iter1; long i; typedef pair <int, AnsiString> Int_Pair; for ( i = 1 ; i <= MyFrm->txtOutput->Lines->Count ; i++ ) { MyFrm->lblCount->Caption = (AnsiString)"Zeile "+i+" von "+MyFrm->txtOutput->Lines->Count+"..."; //Router.swap(); Router.insert ( Int_Pair ( i, explode(1,' ',explode(i,'\n',MyFrm->txtOutput->Text)) ) ); //Datum.insert ( Int_Pair ( i, explode(2,' ',explode(i,'\n',MyFrm->txtOutput->Text)) ) ); //Zeit.insert ( Int_Pair ( i, explode(3,' ',explode(i,'\n',MyFrm->txtOutput->Text)) ) ); } MyFrm->ComboRouter->Clear(); for ( pIter = Router.begin( ) ; pIter != Router.end( ) ; pIter++ ) MyFrm->ComboRouter->Items->Add(pIter -> second); MyFrm->ComboRouter->ItemIndex = 0; }
und der threadaufruf:
_beginthread(&DoCopy,0,Form1);
Die explode funktion sucht nach dem i-ten element das durch das char, das als 2ter parameter übergeben wird getrennt ist. also sucht explode(2,'\n',"24000zeiliger text") nach der 2ten zeile des 24000zeilen textes und wenn man darum ein explode(1,' ',explode(...)) packt kann man das 1. wort der 2 zeile kriegen. ich habe diese funktion getestet und der AnsiString scheint keine probleme mit der länge des übergebenen AnsiStrings zu haben. ich geb euch trotzdem nochmal den quelltext zu meiner funktion. muss man evtl. den stack für den thread erhöhen. oder kann man den dynamisch erweitern?
AnsiString explode(int pos,char divide,AnsiString StringBody) { AnsiString hilf=""; int j=0,i,k=1,l=0; while(StringBody.c_str()[j]==divide && j<StringBody.Length())j++; for(i=j;i<StringBody.Length();i++) { if(k==pos) { while(StringBody.c_str()[i]!=divide && i<StringBody.Length()) { hilf.Insert((AnsiString)StringBody.c_str()[i],hilf.Length()+1); i++; l++; } return hilf; } if(StringBody.c_str()[i]==divide) { while(StringBody.c_str()[i]==divide && i<StringBody.Length())i++; k++; i--; } } return "Fehler: Der String enthält nicht die geforderte Anzahl an Argumenten."; }
danke, david.
-
das problem scheint wohl bei den multimaps zu liegen, wenn ich nämlich die einträge die ich mache, direkt hinterher lösche, gibt es keine probleme. demnach müsste ich für die multimaps wohl mehr speicher reservieren. kann mir jemand sagen, wie das geht?
thx, david.
-
Jetzt bin ich in einer Zwickmühle:
Der Thread passt vielleicht nach WinAPI, weil Threads verwendet werden; eigentlich aber nicht.
Schiebe ich ihn ins Borland Forum, ist es falsch, weil multimap standard C++ ist.
Schiebe ich ihn ins Standard C++ Forum, ist es falsch, da VCL und Threads verwendet werden.Naja, ich verschieb ihn mal nach standard C++, da du ja eben noch eine STL-frage gestellt hast.
Ich hoffe das ist richtig.