Variablen in Klasse können nicht abgerufen werden.
-
Hallo,
ich habe eine Funktion in einer Klasse, die eine bool Variable in der Klasse auf true bzw. false setzt. Nun wenn ich die Funktion normal aufrufe dan kann ich die Variable auch ganz einfach mit "Klassenname::Variable" abfragen, doch wenn ich nun die Funktion mit einem Thread ausführen lasse kann ich die Variablen nicht abrufen, ich mache das so:
if (runThread_Sensor == nullptr) { //Überprüfen ob schon gestartet ThreadStart^ threadDelegate2 = gcnew ThreadStart( &Sensoren::Check_Sensor ); runThread_Sensor = gcnew Thread( threadDelegate2 ); runThread_Sensor->Start(); //Starten } if (Sensoren::sensor_1 == true) { this->checkBox1->Checked = true; } if (Sensoren::sensor_2 == true) { this->checkBox2->Checked = true; } if (Sensoren::sensor_3 == true) { this->checkBox3->Checked = true; } if (Sensoren::sensor_4 == true) { this->checkBox4->Checked = true; }
Hab ich hier einen Denkfehler oder sowas?
Mfg. BNS
-
Push:
Auch wenn ich versuche mit einem anderem Thread die Variablen abzufragen klappt es nicht.
Bitte um Hilfe.
Mfg. BNS
-
Ich sehe weder eine Fehlermeldung, noch ist mir klar ob das da oben jetzt der funktionierende Teil oder der fehlerhafte Teil ist.
-
Es gibt ja auch keine fehlermeldung, es ist nur eben so das wenn ich die Variablen mit einem Thread ändere beim Abfragen einfach den Standart wert kriege.
-
Ich habe mit THreads wenig erfahrung, aber kann es nicht sein, das jeder Thread seine eigenen statischen Variablen hat ?
-
Währe möglich da ich aber die Variablen in der Klasse in denen die Funktionen sind definiert habe und die Funktionen bzw. Threads in diese Schreiben und dann gegenseitig auf die Variablen in den verschiedenen Klassen zugreifen, nur das komische ist das wenn ich die Funktionen normal also nicht in einem Thread ausführe dann geht es!
-
Hab z.z. genau das selbe Problem, und suche eine Antwort drauf, weiß da einer was?
-
Ich poste hier nochmal den Code, vielleicht liegt es daran irgendwo.
Nur sehe ich hier keinen Fehler!//Form Laden private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { inpout32::Load_Config(); //Laden der Konfiguration inpout32::Output(inpout32::output, inpout32::output_start); //LPT Ausgang auf 0-Setzen //Thread Sensoren if (runThread_Sensor == nullptr) { //Überprüfen ob schon gestartet, wenn nicht: ThreadStart^ threadDelegate = gcnew ThreadStart( &Sensoren::Check_Sensor ); runThread_Sensor = gcnew Thread( threadDelegate ); runThread_Sensor->Start(); //Starten } //Thread Visuele Variablen if (runThread_Sensor == nullptr) { //Überprüfen ob schon gestartet, wenn nicht: ThreadStart^ threadDelegate = gcnew ThreadStart( this, &Form1::Visual_Variable ); runThread_Visual = gcnew Thread( threadDelegate ); runThread_Visual->Start(); //Starten } } //Variablen Visualisieren public: void Visual_Variable() { //Alles auf Standart setzen this->checkBox1->Checked = false; this->checkBox2->Checked = false; this->checkBox3->Checked = false; this->checkBox4->Checked = false; this->label9->Text = "Aus"; this->label10->Text = "Aus"; this->label11->Text = "Aus"; this->label12->Text = "Aus"; this->label15->Text = "Aus"; this->label16->Text = "Aus"; this->label18->Text = "Vorwärts"; this->label20->Text = "Vorwärts"; //Motoren if (Steuerung::motor1 == true) { this->label15->Text = "An"; } if (Steuerung::motor2 == true) { this->label16->Text = "An"; } //Sensoren if (Sensoren::sensor_up == true) { this->checkBox1->Checked = true; this->label9->Text = "An"; } if (Sensoren::sensor_back == true) { this->checkBox4->Checked = true; this->label10->Text = "An"; } if (Sensoren::sensor_left == true) { this->checkBox3->Checked = true; this->label11->Text = "An"; } if (Sensoren::sensor_right == true) { this->checkBox2->Checked = true; this->label12->Text = "An"; } //Richtung if (Steuerung::motor1_route == true) { this->label18->Text = "Vorwärts"; } else { this->label18->Text = "Rückwärts"; } if (Steuerung::motor2_route == true) { this->label20->Text = "Vorwärts"; } else { this->label20->Text = "Rückwärts"; } //Thread Sleep Thread::Sleep(inpout32::time_sensoren); } //Funktion zum starten des Parkout Threads public: void Start_Threads() { this->toolStripProgressBar1->Visible = true; //Motoren Starten Steuerung::Start(); //Threads starten //Thread Parkour if (runThread_Parkour == nullptr) { //Überprüfen ob schon gestartet, wenn nicht: ThreadStart^ threadDelegate = gcnew ThreadStart( &Parkour::Parkour_Run ); runThread_Parkour = gcnew Thread( threadDelegate ); runThread_Parkour->Start(); //Starten Parkour::run_parkour = true; } //Button- "Automatische Steuerung" ändern this->button1->Text = "Beenden"; } //Funktion zum Beenden der Threads public: void Stop_Threads() { this->toolStripProgressBar1->Visible = false; //Threads beenden //Thread Parkour if (runThread_Parkour != nullptr) { //Überprüfen ob schon gestartet, wenn ja: runThread_Parkour->Abort(); //Stoppen Parkour::run_parkour = false; //Variable für Parkour Schleife zurückseten runThread_Parkour = nullptr; //Variable für Thread zurücksetzen } //Button- "Automatische Steuerung" ändern this->button1->Text = "Starten"; }
-
Hab nun den Fehler gefunden, und zwar wird die Funktion nur einmal ausgeführt beim Start des Programms so wie es auch soll, aber danach nicht mehr obwohl die funktion in einem thread liegt!