1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Deutsch
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Threads

  • Spite82
  • 10. März 2008 um 22:23
  • Unerledigt
  • Spite82
    8
    Spite82
    Mitglied
    Reaktionen
    1
    Punkte
    571
    Beiträge
    89
    • 10. März 2008 um 22:23
    • #1

    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

  • Wolfibolfi
    37
    Wolfibolfi
    Mitglied
    Reaktionen
    186
    Punkte
    14.936
    Beiträge
    2.942
    • 10. März 2008 um 22:39
    • #2

    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.

  • Spite82
    8
    Spite82
    Mitglied
    Reaktionen
    1
    Punkte
    571
    Beiträge
    89
    • 10. März 2008 um 22:56
    • #3

    Ja danke werd mir das mal anschaun.
    Wieso gibts eigentlich diesen Error, ich mach ja eigentlich mit dem vector nur ein Push, oder reicht das schon?

    Lg
    Spite

  • Wolfibolfi
    37
    Wolfibolfi
    Mitglied
    Reaktionen
    186
    Punkte
    14.936
    Beiträge
    2.942
    • 10. März 2008 um 23:32
    • #4

    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.

  • Spite82
    8
    Spite82
    Mitglied
    Reaktionen
    1
    Punkte
    571
    Beiträge
    89
    • 11. März 2008 um 18:25
    • #5

    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

  • Ringding
    11
    Ringding
    Mitglied
    Reaktionen
    12
    Punkte
    1.237
    Beiträge
    244
    • 11. März 2008 um 23:00
    • #6

    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.

  • Spite82
    8
    Spite82
    Mitglied
    Reaktionen
    1
    Punkte
    571
    Beiträge
    89
    • 12. März 2008 um 08:54
    • #7

    Ah ok, das klingt auch irgendwie logisch :winking_face:
    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

  • Spite82
    8
    Spite82
    Mitglied
    Reaktionen
    1
    Punkte
    571
    Beiträge
    89
    • 12. März 2008 um 09:12
    • #8

    Danke Ringding und Wolfibolfi!!

    Jetzt gehts :winking_face:
    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

  • Wolfibolfi
    37
    Wolfibolfi
    Mitglied
    Reaktionen
    186
    Punkte
    14.936
    Beiträge
    2.942
    • 12. März 2008 um 10:02
    • #9

    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.

  • Spite82
    8
    Spite82
    Mitglied
    Reaktionen
    1
    Punkte
    571
    Beiträge
    89
    • 12. März 2008 um 10:11
    • #10

    Nö, sowas find i nit :frowning_face:
    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)

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung

  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  • Deutsch
  • English
Zitat speichern