_beginthreadex Error



  • Hallo,

    ich würde gerne den Error von der Funktion _beginthreadex() auslehsen, wenn einer auftritt.
    Wie geht das?

    In der Borland-Hilfe steht nur:

    *Wenn nicht erfogreich, wird 0 zurückgegeben und errno auf einen der folgenden Werte gesetzt:

    EAGAIN Too many threads (Zu viele Threads)
    ENOMEM Not enough memory (Speicher nicht ausreichend)
    EINVAL Bad stack size (Ungültige Stack-Größe, also weniger als 16 Byte oder Null)

    Siehe auch die Beschreibung der Win32-API-Funktion GetLastError in der MSDN-Dokumentation.*

    Bzw wie kann ich an den Error EAGAIN oder oder halt an erno kommen?
    Mit der Funktion GetLastError() bekomme ich leider nichts.



  • GetLastError


  • Mod

    errno ist eine einfache Variable der CRTs. Du kannst die einfach abfragen:

    if (errno==WEISNICHTWAS)
    {
    }
    

    Meistens muss noch ein #include <error.h> in den Code.



  • Vielen Dank für die schnelle Antwort!



  • Wobei jetzt habe ich noch eine Frage:
    Wie kann ich den Fehler: ENOMEM beheben?
    Denn Speicher habe ich genug da!



  • Aber es ist kein Stack-Overflow, oder?^^

    Wie hast Du die Funktion denn aufgerufen?


  • Mod

    Ich würde eher darauf tippen, dass einer Deiner Funktionsparameter falsch ist.

    Zeige uns mal den Kontext!



  • _beginthreadex(NULL,0, MoveFiles,Dateiarray,0, &ThreadID);
    


  • Witz komm raus, du bist umzingelt.

    Martin Richter schrieb:

    Zeige uns mal den Kontext!



  • Oh sorry, ich bin heute total neben der Spur!

    static unsigned __stdcall MoveFiles(void* param);
    
    ...
    
    Dateiarray[0]=*Dateiname;
    Dateiarray[1]=Form1->Frame31->Edit1->Text+"\\"+*Dateiname;
    Dateiarray[2]=Form1->Frame31->Edit1->Text+"\\tmp\\"+*Dateiname;
    
    _beginthreadex(NULL,0, MoveFiles,Dateiarray,0, &ThreadID);
    
    ...
    
    unsigned __stdcall TForm1::MoveFiles(void *param)
    {
    
    AnsiString* Dateiarray = static_cast<AnsiString*>(param);
    
    EnterCriticalSection(&cs);
    CSThreadAnz++;
    KopierenAnz++;
    LeaveCriticalSection(&cs);
    
    ...
    

    oder was genau braucht ihr noch?



  • Das übliche Problem... Du vermischt C/C++ und C++/CLI!
    Verwende entweder das eine oder das andere! Aber bitte nicht beide, wenn Du nicht 100%ig weisst, was Du tust!

    Verwende bitte "System::Threading::Thread::Start"

    Beispiel siehe Doku:
    http://msdn.microsoft.com/en-us/library/system.threading.thread.aspx



  • Achso, jedoch ist das ein Problem, wenn ich das so mische??
    Denn andere Threads, die ich so mache laufen im gleichen Programm problemlos!
    In anderen Programmen ist das auch nie ein Problem gewesen!

    ...wie kann ich denn das mit dem Speicherproblem lösen?



  • TheCaleb schrieb:

    Achso, jedoch ist das ein Problem, wenn ich das so mische??

    Wenn Du es verstehst, was WAS ist, ist es kein Problem. Nur vil unnötiger Aufwand bei der Konvertierung von z.B. Strings zwischen den beiden Welten.

    TheCaleb schrieb:

    ...wie kann ich denn das mit dem Speicherproblem lösen?

    Wie viele Threads willst Du denn starten? Du kannst i.d.R. max 1000 Threads starten... dann geht der Speicher aus...



  • Also im Normalfall sind es nicht so viele.
    Da, wo dieser Fehler auftritt laufen ~5



  • Jochen Kalmbach schrieb:

    Das übliche Problem... Du vermischt C/C++ und C++/CLI!

    ????
    Das ist Borland C++ Builder was er da verwendet. Ich sehe nicht mal ein Anzeichen von C++/CLI in dem Code 😮



  • Ahh.. sorry... das "Form1->Frame31->Edit1->Text" sah für mich so aus...
    Na dann ist ja alles gut 😉



  • Hat denn keine ne Idee, wie ich das mit dem Speicher in den Griff bekommen kann?



  • Ich habe jetzt eine Lösung gefunden!
    Es lag an der Stackgröße der Threads, da er default zu klein ist.

    Aber vielen Dank, für eure Hilfe!



  • LOL:

    TheCaleb schrieb:

    Es lag an der Stackgröße der Threads, da er default zu klein ist.

    [...]

    CodeFinder schrieb:

    Aber es ist kein Stack-Overflow, oder?^^



  • ... nur es ist komisch, da es bei mehreren Threads, die ich aus einem Thread starte weiterhin zu dieser Meldung kommt.
    Wenn es nur ~5 sind, dann geht das, bei mehr zickt er.

    Kann es sein, dass ich die Threads immernoch falsch aufrufe??

    _beginthreadex(NULL,4069, Warten,this, 0, &ThreadID)
    

    Bzw ich rufe aus einem Therad mehrere andere auf (max 10) und diese rufen wiederum 1 Thread auf.


Log in to reply