Index eines Vectorelements in einer Struktur an neuen Thread übergeben?



  • Hallo zusammen,

    ich möchte im primären Thread1 eine Structur erstellen die z.B. einen "vector<int> TEST(4)" enthält. Im Thread1 erhält der Vektor für jedes Element einen Wert zugewiesen. Diese Werte ergeben sich später durch die Benutzerauswahl in einer GUI.

    Diese Struktur wird dann an einen Thread2 übergeben, der jeweils das ihm zugewiesene Vectorelement zur Abarbeitung benutzen soll.
    Ich weiß nur leider nicht, wie ich dem Thread mitteilen kann welches Vektorelement für ihn bestimmt ist.

    Könnte mir jemand dabei weiterhelfen?

    Viele Grüße
    Pixar

    typedef struct { 
    vector<int> TEST; 
    //others 
    } GUI, *PGUI; 
    
    void Thread2(PVOID pvoid){ 
    PGUI StructTest; 
    StructTest=(PVOID)pvoid; 
    
    //wie kann mann Thread2 mitteilen, welchen Vectorindex der Struktur er auslesen soll? 
    int x=StructTest->Test[???]; 
    
    //do something 
    return; 
    } 
    
    void Thread1(PVOID pvoid){ 
    
    GUI GUIStruct;
    GUIStruct.Test[0]=12; 
    GUIStruct.Test[1]=2; 
    GUIStruct.Test[2]=5; 
    GUIStruct.Test[3]=8; 
    
    for(int i=0; i<GUIStruct.Test.size(); i++)
    //wie übergibt man an Thread2 den Schleifenindex "i" als auszulesenden Vectorindex der übergebenen Struktur?
     _beginthread(Thread2,0,&GUIStruct); 
    
    //Programm wartet bis der SekundärThread beendet wurde 
    return; 
    } 
    
    int WinMain(){ 
    //auf Benutzereingabe starte Primär-Thread 
    }
    


  • Sehe ich das richtig, dass Thread2 nur einmal zu einer Zeit laufen soll und vor dem Starten des nächsten Thread2 gewartet wird, bis der zuvor gestartete Thread2 zu Ende gelaufen ist?
    Falls ja, pack den Index mit in die Struktur.



  • Hallo Belli,

    nein nicht ganz. Der Thread2 soll über die for-Schleife in Thread1 so oft direkt hintereinander gestartet werden, wie der Vektor Elemente besitzt (z.B. für parallele Bearbeitung mehrerer Dateinamen, oder Umwandlung in verschiedene Dateiformate, etc.)

    Das Warten ist nötig, weil Thread1 die Struktur vorhält auf die alle Thread2-Instanzen zugreifen.

    Viele Grüße
    Pixar



  • Zeile 27:
    _beginthread(Thread2, 0, &GUIStruct[i]);

    Oder vielleicht
    pair<GUI*, int> p(&GUIStruct, i);
    _beginthread(Thread2, 0, &p);



  • Letzteres sollte man nicht machen, automatische Variablen und deren verschwinden und Pointer darauf und so.



  • Hallo nwp3,

    danke, für den Vorschlag.

    Wenn ich jetzt das jweilige Vektorelment mit "&GUIStruct.Test[i]" übergebe, hab ich in Thread2 aber offenbar nur Zugriff auf das jeweilige Vektorelement [i].

    Wie bekäme ich dann Zugriff auf die restlichen Member der Thread1-Struktur, ohne das ich die Thread1-Struktur wiederum irgendwie als global definieren muss?

    Viele Grüße
    pixar



  • Wenn die Thread2 alle gleichzeitig laufen sollen, sehe ich so aus dem Ärmel zwei Möglichkeiten:
    Entweder für jeden Thread2 eine eigene Struktur erstellen, die dann auch nicht den ganzen Vektor benötigt, sondern nur das für diesen Thread2 gedacht Element. Zum Beispiel mit new in der Schleife erzeugen, füllen, Thread2 starten und diesen am Ende delete aufrufen lassen.
    Oder noch mal meine erste Idee:
    Den Index mit in die Struktur packen, den Thread2 starten, Thread1 warten lassen bis Thread2 signalisiert (Event oder ähnlich), dass er den Index 'entnommen' und in einer lokalen Variablen gespeichert hat und erst dann den nächsten Thread2 mit einem neuen Indexwert in der Struktur starten ...



  • Vielen Dank, ich werde mich für eine zusätzliche Index-Variable in der Struktur entscheiden.



  • Okay, aber denk dran:

    Belli schrieb:

    Thread1 warten lassen bis Thread2 signalisiert (Event oder ähnlich), dass er den Index 'entnommen' und in einer lokalen Variablen gespeichert hat und erst dann den nächsten Thread2 mit einem neuen Indexwert in der Struktur starten ...

    weil ja dann alle Thread2 auf dieselbe Variable zugreifen, die aber für jeden Thread2 einen anderen Inhalt haben soll - Du darfst also die Indexvariable für den nächsten Thread2 erst aktualisieren, wenn der zuletzt gestartete Thread2 signalisiert hat, dass er 'seinen' Index lokal gesichert hat.



  • Alles klar, ein WaitForSingleObject() für Thread1 ist vermerkt.


Anmelden zum Antworten