_beginthreadex Error



  • 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.



  • TheCaleb schrieb:

    ... 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.

    Meinst Du nicht auch, dass 4069 Bytes für den Stack etwas arg wenig sind?

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


  • Mag sein, ich habe nur keine Ahnung woe groß der Stack sein sollte!

    Auf jeden Fall tritt bei

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

    ständig der Fehler ENOMEM auf, wenn ich halt alle Threads starten lasse.
    Wenn ich die Zahl auf der Threads auf 2 minimiere(wo ja sonst auch immer der Fehler auftrat), die der erste Thread aufruft, dann klappt das, sonst tritt halt dieser Fehler auf.

    Was soll ich nu machen?

    Kann das an den Compilereinstellungen liegen oder muss ich voher irgendeine Funktion ausführen oder muss ich die Threads anders aufrufen??



  • Dann vermute ich, dass mindestens einer Deiner Threads Unmengen an lokalem Speicher verwendet (z.B. char szTest[100000]). Diesen Speicher solltest Du dynamisch anlegen.



  • Ich lege ansich die meisten Variabeln dynamisch an, bzw eine Unmenge lege ich auch nicht an!
    Es muss an irgendwas anderes liegen!



  • Dann poste halt mal ein Minimalbeispiel, welches das Problem reproduziert. Haben keine Lust hier rumzuraten, was du in deinem Code treibst!



  • Debugge doch einfach mal rein bis zu CreateThread und schau Dir den "richtigen" Fehlercode an!!!!!!



  • Kann es sein, dass man ein Thread mit

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

    nicht öfters in kurzer Zeit nach einander erstellen darf/kann?

    Ich habe mein Programm nochmal völlig umgeschrieben und mir ist aufgefallen, dass wenn ich ein paar Millisekunden warte, dann klappt das!
    Woran kann das liegen?

    Ich starte jetzt auch nur noch max 5 Threads!



  • Ähhh... habe ich mich nicht deutlich ausgedrückt?
    Reindebuggen?

    PS: Und wenn Du Threads in "ms" Abstand erstellst ist mir klar, das Du Probleme bekommst... Du kannst nur eine bestimmte (kleine) Anzahl an Threads pro Prozess erstellen!


Anmelden zum Antworten