Einen Thread im Hintergrund erstellen
-
Hallo!
Ich möchte bei meiner Anwendung im Hintergrund einen Thread laufen lassen, der einen seriellen Port abhört. Leider habe ich dazu keine brauchbaren Vorlagen gefunden. Im Beispiel zur SerialPort Klasse ist Code angegeben, der mit einem Thred arbeitet, aber der funzt bei mir nicht. Auch der hier zu findende http://support.microsoft.com/?kbid=815805 Beispielcode aus der MSDN funktioniert leider nicht. Ich kann das Beispiel nicht kompilieren, auch nicht, wenn ich den Syntax auf Oldsyntax nach Vorgabe einstelle. Außerdem enthält eine WindowsForms Anwendung bei mir keine Dispose()-Methode, wie in dem Beispiel beschrieben. Kann mit jemand weiterhelfen?
-
Kannst DU mal den Code posten der nicht geht?
-
OK hier der Code den ich anhand des Links in meinem vorherigen Posting gemacht habe. Dabei habe ich die Dispose()-Methode nicht gefunden. In dem Beispiel sieht es so aus, als ob sie schon vorhanden sein sollte. Der Code:
#pragma once namespace ThreadWinApp { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Threading; /// <summary> /// Zusammenfassung für Form1 /// /// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch /// die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern, /// das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt. /// Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen /// arbeiten, die diesem Formular zugewiesen sind. /// </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::Windows::Forms::Button^ button1; protected: private: /// <summary> /// Erforderliche Designervariable. /// </summary> System::ComponentModel::Container ^components; private: System::Windows::Forms::ProgressBar^ progressBar1; private: Thread *trd; __delegate void DelegateThreadTask(); private: void ThreadTask() { int stp; int newval; Random *rnd=new Random(); if (progressBar1->InvokeRequired == false) { stp=this->progressBar1->Step*rnd->Next(-1,2); newval = this->progressBar1->Value + stp; if (newval > this->progressBar1->Maximum) newval = this->progressBar1->Maximum; else if (newval < this->progressBar1->Minimum) newval = this->progressBar1->Minimum; this->progressBar1->Value = newval; } else { DelegateThreadTask *myThreadDelegate = new DelegateThreadTask(this,ThreadTask); this->Invoke(myThreadDelegate); } } private: void repeat() { while(true) { ThreadTask(); Thread::Sleep(100); } } #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->button1 = (gcnew System::Windows::Forms::Button()); this->progressBar1 = (gcnew System::Windows::Forms::ProgressBar()); this->SuspendLayout(); // // button1 // this->button1->Location = System::Drawing::Point(109, 125); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(75, 23); this->button1->TabIndex = 0; this->button1->Text = L"button1"; this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); // // progressBar1 // this->progressBar1->Location = System::Drawing::Point(96, 189); this->progressBar1->Name = L"progressBar1"; this->progressBar1->Size = System::Drawing::Size(100, 23); this->progressBar1->TabIndex = 1; // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(292, 273); this->Controls->Add(this->progressBar1); this->Controls->Add(this->button1); this->Name = L"Form1"; this->Text = L"Form1"; this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load); this->ResumeLayout(false); } #pragma endregion private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { MessageBox::Show(S"This is the main thread"); } private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { ThreadStart *myThreadDelegate = new ThreadStart(this, repeat); trd = new Thread(myThreadDelegate); trd->IsBackground = true; trd->Start(); } }; }
Und hier die Fehlermeldungen:
Fehler 1 error C2059: Syntaxfehler: 'public' c:\threadwinapp\threadwinapp\Form1.h 23
Fehler 2 error C2059: Syntaxfehler: 'public' c:\threadwinapp\threadwinapp\Form1.h 23
Fehler 3 error C2143: Syntaxfehler: Es fehlt ';' vor '{' c:\threadwinapp\threadwinapp\Form1.h 24
Fehler 4 error C2447: '{': Funktionskopf fehlt - Parameterliste im alten Stil? c:\threadwinapp\threadwinapp\Form1.h 24
Fehler 5 error C2065: 'array': nichtdeklarierter Bezeichner c:\ThreadWinApp\ThreadWinApp\ThreadWinApp.cpp 9
Fehler 6 error C2275: 'System::String': Ungültige Verwendung dieses Typs als Ausdruck c:\ThreadWinApp\ThreadWinApp\ThreadWinApp.cpp 9
Fehler 7 error C2059: Syntaxfehler: '>' c:\ThreadWinApp\ThreadWinApp\ThreadWinApp.cpp 9
Fehler 8 error C2143: Syntaxfehler: Es fehlt ';' vor '{' c:\ThreadWinApp\ThreadWinApp\ThreadWinApp.cpp 10
Fehler 9 error C2447: '{': Funktionskopf fehlt - Parameterliste im alten Stil? c:\ThreadWinApp\ThreadWinApp\ThreadWinApp.cpp 10Aber es geht mir nicht um dieses spezielle Beispiel. Ich müsste nur das Prinzip verstehen, wie man so etwas realisiert.