Multithreading: static vector kann nicht verändert werden



  • Ich habe ein selbstgeschriebenes Programm auf Multithreading umgeschrieben. Mein Problem ist nun, dass die Threading::Thread Klasse zwingend static Variablen voraussetzt.

    Ich habe also alles entsprechend angepasst und stehe vor dem Problem, dass ich bei einem static Vector die Elemente nicht mehr verändern kann.
    Resize, Push_Back und andere sind allesamt außer Funktion. 😕

    Wie kann ich das Problem lösen?

    Gibt es eine Möglichkeit, auch ohne static zu arbeiten, wenn ich mit mehreren Threads programmiere?



  • Mein Problem ist nun, dass die Threading::Thread Klasse zwingend static Variablen voraussetzt.

    Das ist Humbug!

    Zeig deinen Code!

    Wenn mehrere Threads schreiben und lessend auf eine Variable zugreifen muss synchronisiert werden!



  • Das habe ich vielleicht falsch ausgedrückt. Aber ich bekomme es partout nicht hin, dass er meinen Code kompiliert, wenn ich den Thread nicht static mache. 😞

    Ich arbeite zunächst an verkleinerten Programmen, um den Überblick zu behalten:

    Dieser Code funktioniert nicht.

    //OberKlasse.h
    
    ref class OberKlasse
    {
    public:
        OberKlasse(int Startwert, int Arraygröße);
        ~OberKlasse();
        //Threading ^Threads;
    	System::Threading::Thread ^NeuThread;
    	void Funktion(System::Object^ Wert);
    }; 
    
    //OberKlasse.cpp
    
    #include "stdafx.h"
    
    using namespace System::Threading;
    
    OberKlasse::OberKlasse(int Startwert, int Arraygröße)
    {
    	NeuThread = gcnew Thread(gcnew ParameterizedThreadStart(Funktion));
    }
    OberKlasse::~OberKlasse()
    {
    
    }
    
    void OberKlasse::Funktion(System::Object^ Wert)
    {
    //Code folgt später
    }
    
    1>.\OberKlasse.cpp(7) : error C3867: "OberKlasse::Funktion": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&OberKlasse::Funktion", um einen Zeiger auf den Member zu erstellen.
    1>.\OberKlasse.cpp(7) : error C3350: "System::Threading::ParameterizedThreadStart": Ein Delegatkonstruktor erwartet 2 Argument(e).
    

    Mit static:

    //OberKlasse.h
    
    ref class OberKlasse
    {
    public:
        OberKlasse(int Startwert, int Arraygröße);
        ~OberKlasse();
        //Threading ^Threads;
        static System::Threading::Thread ^NeuThread;
        static void Funktion(System::Object^ Wert);
    }; 
    
    //OberKlasse.cpp
    
    #include "stdafx.h"
    
    using namespace System::Threading;
    
    OberKlasse::OberKlasse(int Startwert, int Arraygröße)
    {
    	NeuThread = gcnew Thread(gcnew ParameterizedThreadStart(Funktion));
    }
    OberKlasse::~OberKlasse()
    {
    
    }
    
    void OberKlasse::Funktion(System::Object^ Wert)
    {
    //Code folgt später
    }
    

    Der untere Code funktioniert ohne Probleme.
    Ich habe schon in der Hilfe zu VC++ 2008 geschaut, aber ich komme nicht so ganz zurecht mit dem gegebenen Beispiel.



  • Die Fehlermeldung bzgl. ParameterizedThreadStart ist doch eindeutig: dieser bekommmt (in C++/CLI) 2 Parameter: das Objekt und der Zeiger auf die Klassenmethode:

    gcnew Thread(gcnew ParameterizedThreadStart(this, &OberKlasse::Funktion));
    

    s.a. MSDN-Eintrag dazu (inklusive Beispiel!): http://msdn.microsoft.com/de-de/library/system.threading.parameterizedthreadstart.aspx



  • Th69 schrieb:

    Die Fehlermeldung bzgl. ParameterizedThreadStart ist doch eindeutig: dieser bekommmt (in C++/CLI) 2 Parameter: das Objekt und der Zeiger auf die Klassenmethode:

    gcnew Thread(gcnew ParameterizedThreadStart(this, &OberKlasse::Funktion));
    

    s.a. MSDN-Eintrag dazu (inklusive Beispiel!): http://msdn.microsoft.com/de-de/library/system.threading.parameterizedthreadstart.aspx

    Args. 😕 Ok, das hatte ich noch nicht versucht... Ich wusste nicht, dass so großer Wert auf das "OberKlasse::" gelegt wird. 😞

    Ich habe das mal in mein richtiges Programm übertragen und nun läuft alles perfekt. 😃
    Vielen lieben Dank, nun konnte ich endlich mein Projekt fertigstellen. 🙂

    Frage am Rande: Gibt es irgendwo gute (bekannte) Websites, wo man selbstgeschriebenen Code unter eine OpenSource-Lizenz stellen lassen kann?


Anmelden zum Antworten