• Hallo an alle Chief-Checker,

    ich habe ein Problem mit Threads und c++/.net

    Ich habe ein c++ Programm als lib compiliert, und daraus werden dann Methoden aus einer Winforms-GUI-Anwendung aufgerufen.
    Ich hoffe soweit ist alles klar.

    Ich versuche jetzt in meinem GUI-Teil des Projekts mehrere BackgroundWorker zu starten, was anscheinend auch funktioniert (denn wenn ich mit Haltepunkten durchgehe, sehe ich, das ich in meiner "DoWork" Methode 2 mal drinnen bin....

    Jetzt das eigetntliche Problem:
    meine DoWork ruft immer die gleiche Methode aus der lib auf (also asynchron 2mal)
    In dieser Methode wird zu einem vector<myStruct> xyz jeweils ein Element gepusht.
    An dem Zeitpunkt, an dem der 2. Thread startet bekomme ich irgendwelche Errors, und ich denke das liegt an ebendiesem Push, wie kann man das machen, daß 2Threads Elemente zum selben vector hinzufügen können, ohne Errors zu bekommen??

    Wär cool, wenn jemand was weiss


    Lg
    Spite

  • Mit einem Mutex schützen, in der .net Hilfe steht dabei, wies geht. Ansonsten nach Beispielen googeln.

    In einen FBO rendern ist wie eine Schachtel Pralinen - man weiß nie, was man kriegt.

  • Die Push-Methode besteht ja wahrscheinlich auch aus mehreren Aktionen und kann daher unterbrochen werden. Wenn der Vector sich nicht selbst schützt, musst du das tun.

    In einen FBO rendern ist wie eine Schachtel Pralinen - man weiß nie, was man kriegt.

  • Habs mit einer Critical Section probiert (global):
    Initialisiert, dann Enter, dann der Methodenaufruf, dann Leave und zum Schluss Destroy - funktioniert trotzdem leider nicht....

    Anscheinend kriegt er sich in die Haare beim löschen eines Structs, das eben dem Vektor hinzugefügt wird und danach die Methode fertig abgearbeitet ist (also das Struct gelöscht wird)

    Geh ich e recht in der Annahme, daß:
    * lokale Variablen zB 2mal existieren, wenn eine Methode von 2 Threads aufgerufen wird
    * globale Variablen nur einmal existieren, egal wie viele Threads darauf zugreifen

    Was mich wundert ist:
    Ich habe ein GUI (natürlich einn Thread) der startet einen 2. Thread, der Berechnungen macht. Im GUI-Thread sieht man aber auch die Ergebnisse des 2.Threads, daher greift der GUI-Thread auch auf die globalen Variablen zu (die der Berechnungs-Thread bearbeitet).... so komm ich zumindest zu meinen Annahmen von oben ;). Also GUI_Thread und ein Backgroundworker funktioniert hier, allerdings GUI und 2 Backgroundworker - da gibts eben die Probleme....
    Im ersten Fall fügt nur ein Backgroundworker vector-Elemente hinzu, im 2.Fall machen das beide Backgroundworker, das ist der einzige Unterschied, den ich erkennen kann....

    Vielleicht gibts noch was, was ich nicht berücksichtigt habe?

    Lg
    Spite

  • Du kannst die Critical Section nicht einfach so zerstören, nachdem du sie verwendet hast. Die soll üblicherweise beim Programmstart oder sonst irgendeiner Initialisierung erzeugt und erst ganz am Schluss, wenn sie garantiert nicht mehr in Verwendung ist, zerstört werden – natürlich kann man in den meisten Fällen auch einfach so das Programm beenden. Das sind ja nur ein paar Werte im Speicher…

    Jedenfalls ist die Grundidee, dass alle Threads, die einander ausschließen sollen, dieselbe Critical Section verwenden. Wenn jeder seine eigene verwendet (was du durch das Ständige Erzeugen und Zerstören hättest), dann bringt das gar nix.

  • Ah ok, das klingt auch irgendwie logisch ;)
    Wenn ich allerdings meine CriticalSection beim Programmstart erzeuge (InitializeCriticalSection) kann ich dann trotzdem nur für den einen Befehl das Enter und Leave machen oder versteh ich das wieder falsch? Ich werd mal so probiern, daß die CriticalSection gleich initialisiert wird beim erstellen des Objektes und einfach Destroyed wird beim Beenden des Programms.

    Lg
    Spite

  • Danke Ringding und Wolfibolfi!!

    Jetzt gehts ;)
    Hab eben das erste mal Thread und c++ zu tun, daher wusste ich nicht wie man das anstellt, aber jetzt funzts!
    Find ich echt sehr cool: hab jetzt eben einen Algo, der je nach ProzessorCount eine beliebige Anzahl von Threads startet, die die Berechnungen machen - optimal.
    Jetzt kann ich dann endlich weitermachen :)

    Lg
    Spite

  • Sehr fein! Garnet gewusst, dass man den Processorcount so einfach auslesen kann (habs jetzt eh ergoogelt). Ich hab das damals für ein Prog mit ner Edit-Box gelöst, aber ich wollt auch ca. doppelt so viele Threads wie CPUs, da die im Hintergrund auch was runterladen, bevor sie rechnen.

    EDIT: Du könntest uns auch thanken, falls die Buttons bei dir da sind.

    In einen FBO rendern ist wie eine Schachtel Pralinen - man weiß nie, was man kriegt.

  • Nö, sowas find i nit :(
    Wo soll des sein?

    Lg
    Spite

    PS: Prozessor-Count lies ich im GUI-aus, in dem dann die Threads gestartet werden. (.Net -> System::Environment::ProcessorCount::get() - so in etwa müssts heißen)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!