RS232 Empfangene Daten darstellen, Thread-Safe
-
Sehr geehrte Community ,
ich, ein dummer C++ Anfänger, muss euch jetzt nochmal mit dem leidigen Thema "Thread-Übergreifender-Zugriff" belästigen.
Hab ne kleine Anwendung erstellt welche die empfangenen Daten der seriellen Schnittstelle in einer TextBox ausgeben soll.
Hier kleines Bildchen davon:
http://s14.directupload.net/images/120711/9agxra5g.jpgIhr wisst ja wahrscheinlich dass es dabei zum Problem mit den unterschiedlichen Threads kommt.
Kann mir bitte jemand nochmal, mit einfachen Worten, erklären wie man das Problem mit invoke & Co. behebt.Hier mein Source-Code:
#pragma once namespace rs232 { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Zusammenfassung für Form1 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: Konstruktorcode hier hinzufügen. // } protected: /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> ~Form1() { if (components) { delete components; } } private: System::IO::Ports::SerialPort^ serialPort1; protected: private: System::Windows::Forms::TextBox^ textBox1; private: System::Windows::Forms::Button^ button1; private: System::Windows::Forms::Label^ label1; private: System::ComponentModel::IContainer^ components; private: /// <summary> /// Erforderliche Designervariable. /// </summary> #pragma region Windows Form Designer generated code /// <summary> /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// </summary> void InitializeComponent(void) { this->components = (gcnew System::ComponentModel::Container()); this->serialPort1 = (gcnew System::IO::Ports::SerialPort(this->components)); this->textBox1 = (gcnew System::Windows::Forms::TextBox()); this->button1 = (gcnew System::Windows::Forms::Button()); this->label1 = (gcnew System::Windows::Forms::Label()); this->SuspendLayout(); // // serialPort1 // this->serialPort1->DataReceived += gcnew System::IO::Ports::SerialDataReceivedEventHandler(this, &Form1::serialPort1_DataReceived); // // textBox1 // this->textBox1->Location = System::Drawing::Point(117, 53); this->textBox1->Name = L"textBox1"; this->textBox1->Size = System::Drawing::Size(163, 20); this->textBox1->TabIndex = 0; // // button1 // this->button1->Location = System::Drawing::Point(12, 12); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(75, 23); this->button1->TabIndex = 1; this->button1->Text = L"COM öffnen"; this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); // // label1 // this->label1->AutoSize = true; this->label1->Location = System::Drawing::Point(9, 56); this->label1->Name = L"label1"; this->label1->Size = System::Drawing::Size(99, 13); this->label1->TabIndex = 2; this->label1->Text = L"Empfangene Daten"; // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(292, 102); this->Controls->Add(this->label1); this->Controls->Add(this->button1); this->Controls->Add(this->textBox1); this->Name = L"Form1"; this->Text = L"RS232"; this->ResumeLayout(false); this->PerformLayout(); } #pragma endregion private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { serialPort1->Open(); } private: System::Void serialPort1_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e) { textBox1->Text=serialPort1->ReadExisting(); //Thread-Übergreifender Zugriff !!! } }; }
Achso, da fällt mir noch etwas wichtiges ein.
Es wäre ein Traum wenn die empfangenen Daten in einem String gespeichert werden könnten. Klingt eigentlich einfach ... stellt sich aber auch als Herausforderung heraus.
In der Konsolenanwendung war das ja kein Stress,
aber hier lässt sich nicht so einfach ein String global deklarieren.
Könnten ihr mir bitte auch da auf die Sprünge helfen.Ich danke Euch vielmals im voraus !!!
Grüße Micha
-