_beginthreadex Error



  • Naja, das ist nicht unbedingt zielführend, da Du weisst ja nicht, was in "_beginthread" sonst noch alles gemacht wird!

    Einfacher ist: Ersetze "_beginthread" durch "CreateThread" und rufe dann GetLastError, auf, wenn es schief ging!!!



  • Jochen Kalmbach schrieb:

    Naja, das ist nicht unbedingt zielführend, da Du weisst ja nicht, was in "_beginthread" sonst noch alles gemacht wird!

    Einfacher ist: Ersetze "_beginthread" durch "CreateThread" und rufe dann GetLastError, auf, wenn es schief ging!!!

    _beginthreadex allokiert TLS-Speicher für die CRT-Datenstrukturen und ruft dann CreateThread auf. Im Fehlerfall wird der Speicher wieder freigegeben. Mehr passiert da nicht.



  • Er verwendet die Borland-CRT... ich hab sie halt nicht hier und müsste raten, was Borland da macht...



  • Also was soll ich nun machen?
    Diese Fehlermeldung ist ja eine von dem Errorcodesatz von GetLastError, nur dass der in errno drin steht!
    Also soll ich nu mal CreateThread antesten??
    Denn mit dieser Funktion habe ich noch keine Erfahrungen!



  • Probiere doch erst einmal meinen Vorschlag. Wenn GetLastError nichts Vernünftiges ausgibt, dann machst Du es wie Jochen es vorgeschlagen hat.



  • GetLastError() gibt bei CreateThread den Fehler 8 raus:

    8
    ERROR_NOT_ENOUGH_MEMORY
    Not enough storage is available to process this command.



  • Tja, dann liegt es wohl am fehlenden Speicher (vermutlich dem Stack).

    Ich würde jetzt alles in den Threadfunktionen auskommentieren und nacheinander wieder freigeben, um den Verursacher zu finden.



  • Wie viel Speicher benützt denn Deine Applikation?

    Ein Programm kannn z.B. Memory-Fragmentierung sein. Lass es mal unter WinDbg laufen und rufe mal

    !address -summary
    

    auf.



  • Okay machen wa es einfach mal so:
    Ich habe diese beiden Threadfunktionen, wobei Bearbeiten nicht komplett ist aber alles, was ich bis jetzt nicht auskommentiert habe!
    Wenn ich also erst 4x Bearbeiten und 1x MoveFiles aufrufe, dann tritt nach dem o.g. Aufruf der Fehler ENOMEM oder halt Fehlercode 8 auf!
    Keine Sorgen, die beiden Funktionen sind nicht fertig und ich werde dort noch vieles anders machen, nur erstmal möchte ich diesen scheiss Error loswerden!

    Zu meinem System: Es hat 4 GB Arbeitsspeicher und 10 GB Auslagerungsdatei und daher kann es an dem Speicher NICHT mangeln, zudem verbraucht das Programm im Taskmanager gerade mal 3 MB!

    unsigned __stdcall TForm1::Bearbeiten(void *param)
    {
            AnsiString* Dateiarray = static_cast<AnsiString*>(param);
    
    	EnterCriticalSection(&cs);
    	CSThreadAnz++;
    	BearbeitenAnz++;
    	LeaveCriticalSection(&cs);
    
    	while(1)
    	{
    		if(BearbeitenAnz==1)
    		{
    			OpenSemaphore(SEMAPHORE_ALL_ACCESS,true,"ECBearbeiten");
    		}
    
    		for(unsigned int z=1;z<atoi(Dateiarray[0].c_str());z++)
    		{
    
    			AnsiString Dateiname=Dateiarray[z];
    			int fileSize=atoi(Dateiarray[++z].c_str());
    
    			if(!(Dateiname.AnsiPos("\\tmp\\")))
    			{
    				EnterCriticalSection(&cs3);
    				CopylistFrom->Add(Form1->Frame31->Edit1->Text+"\\"+Dateiname);
    				CopylistTo->Add(Form1->Frame31->Edit1->Text+"\\tmp\\"+Dateiname);
    				LeaveCriticalSection(&cs3);
    
    			}
    		}
    		WaitForSingleObject(OpenSemaphore(SEMAPHORE_ALL_ACCESS,true,"ECBearbeiten"),INFINITE);
    	}
    	return 0;
    }
    
    unsigned __stdcall TForm1::MoveFiles(void *param)
    {
    	EnterCriticalSection(&cs);
    	CSThreadAnz++;
    	Kopieren=true;
    	LeaveCriticalSection(&cs);
    
    	while(1)
    	{
    		while(CopylistFrom->Count!=0)
    		{
    			EnterCriticalSection(&cs3);
    			AnsiString From=CopylistFrom->Strings[0];
    			AnsiString To=CopylistTo->Strings[0];
    			CopylistFrom->Delete(0);
    			CopylistTo->Delete(0);
    			LeaveCriticalSection(&cs3);
    
    			MoveFileEx(From.c_str(),To.c_str(),MOVEFILE_COPY_ALLOWED);
    
    			AnsiString error=GetLastError();
    
    			if(80==error)
    				MoveFileEx(From.c_str(),(To+"_"+Exists++).c_str(),MOVEFILE_COPY_ALLOWED);
    		}
    		WaitForSingleObject(OpenSemaphore(SEMAPHORE_ALL_ACCESS,true,"ECBearbeiten"),INFINITE);
    	}
    
    	EnterCriticalSection(&cs);
    	CSThreadAnz--;
    	Kopieren=false;
    	LeaveCriticalSection(&cs);
    
    	return 0;
    }
    


  • Hat denn keiner ne Ahnung, woran das liegen kann mit diesem Fehler??



  • So, ich habe endlich den Fehler beheben können!
    Es lag an den Compilereinstellungen!

    Es gibt bei Borland noch eine Release- Konfiguration und ich habe einfach die Optionen an die Debug- Konfiguration angeglichen, sodass ich aber noch die Debug- Funktionen habe!



  • Scherz?


Anmelden zum Antworten