Thread benutzen wie
-
Hallo ich möchte in Visual C++ Threads verwenden und hab mir folgendes programm erstellt
#include<Windows.h> #pragma once namespace Thread1 { 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::Windows::Forms::Button^ button1; protected: private: /// <summary> /// Erforderliche Designervariable. /// </summary> System::ComponentModel::Container ^components; #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->SuspendLayout(); // // button1 // this->button1->Location = System::Drawing::Point(13, 26); 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::t); // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(292, 266); this->Controls->Add(this->button1); this->Name = L"Form1"; this->Text = L"Form1"; this->ResumeLayout(false); } #pragma endregion DWORD WINAPI PR (LPVOID u) { return 1; } private: System::Void t(System::Object^ sender, System::EventArgs^ e) { HANDLE tr; DWORD N; tr = CreateThread (NULL, NULL, &PR, NULL, NULL, &N); } }; }
Es soll wenn man auf den Knopf drückt ein Thread erzeugt werden. Aber das Programm lässt sich nicht Compiliren wo ist der fehler ich bekomme folgende Meldungen
[list]1>------ Erstellen gestartet: Projekt: Thread, Konfiguration: Debug Win32 ------
1> Thread.cpp
1>c:\thread\thread\thread\Form1.h(81): warning C4441: Die Aufrufkonvention von "__stdcall " wird ignoriert; stattdessen wird "__clrcall " verwendet.
1>c:\thread\thread\thread\Form1.h(93): error C2276: '&': Ungültige Operation auf Ausdruck einer gebundenen Memberfunktion
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
[list]
-
Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum FAQ - C++/CLI in das Forum C++/CLI mit .NET verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Wenn Du schon C++/CLI verwenden willst (wovon ich abrate), dann verwende auch die .NET THreads:
System::Threading::ThreadUnd beachte auch:
http://blog.kalmbach-software.de/de/2010/03/05/ccli-und-winforms-macht-keinen-sinn/
-
Ich verwende Windos Forms weil man damit seine Benutzeroberfläche zusammen kliken kann. Es wäre net wenn mir jemand ein einfachen Windows Forms Cod geben könnte der ein Thread erzeigt?
-
Jim20115 schrieb:
Ich verwende Windos Forms weil man damit seine Benutzeroberfläche zusammen kliken kann. Es wäre net wenn mir jemand ein einfachen Windows Forms Cod geben könnte der ein Thread erzeigt?
Das ist .NET. Es spielt keine Rolle, ob du Windows Forms benutzt oder so St etwas. Threads werden immer gleich erzeugt und genutzt. Entsprechenden Code kannst du deshalb einfach selbst finden, indem du nach System.Threading.Thread suchst.
Trotzdem: gcnew Thread(gcnew ThreadStart(&PR, this))->Start();
Alle Angaben aus dem Kopf
-
Ich hab
gcnew Threading::Thread(gcnew Threading::ThreadStart(&PR, this))->Start();
ausprobirt
und
gcnew Thread(gcnew ThreadStart(&PR, this))->Start();
ausprobirt
beides lies sich nicht Compiliren woran liegs was genau muss ich schreiben?
-
Mit Beispiel für die Konsole in C++/Cli.
http://msdn.microsoft.com/de-de/library/system.threading.thread.aspx#Y6042
Tipp: Wenn du das Programm veröffentlichen willst, dann solltest du C# nehmen.
-
Jim20115 schrieb:
Ich verwende Windos Forms weil man damit seine Benutzeroberfläche zusammen kliken kann.
Wenn du Benutzeroberflächen zusammenklicken willst dann verwend doch bitte C#. C++/CLI ist dafür absolut ungeeignet.
-
ich hab Funktionen in C++ geschrieben die auf die Standart Libar zugreifen. Kann ich diese problemlos in C# verwenden ohne etwas an der Syntext zu ändern,ist C# auch kostenlos? Muss man irgentetwas instaliren um ein Programm das in C# geschriben ist laufen zu lassen?
Ich hab einen Thread in Visual C++ erzeugen können.
Wie kann ich von dem erzeugten Thread auf die Steuerelemente des Hauptprogramms zugreifen?
-
Jim20115 schrieb:
ich hab Funktionen in C++ geschrieben die auf die stan**** Libar zugreifen. Kann ich diese problemlos in C# verwenden ohne etwas an der Syntext zu ändern
Jein. Du müsstest die in C++ geschriebenen Funktionen in eine DLL auslagern. Auf diese kannst du dann mittels p/invoke zugreifen.
Jim20115 schrieb:
ist C# auch kostenlos? Muss man irgentetwas instaliren um ein Programm das in C# geschriben ist laufen zu lassen?
Nö hat die selben Vorraussetzungen wie C++/CLI. Also ohne .NET Framework läuft nix.
Jim20115 schrieb:
Ich hab einen Thread in Visual C++ erzeugen können.
Wie kann ich von dem erzeugten Thread auf die Steuerelemente des Hauptprogramms zugreifen?Sowas macht man überhaupt nicht. Erstelle eine Methode, die die Änderung am GUI vornimmt und sicher ab, dass keine Threadübergreifenden GUI Zugriffe erfolgen. Stichwort: Control.Invoke
-
Ich hab schon ein paar gute Funktionen in C++ geschrieben. Die ich ohne probleme in Visual C++ verwenden kann deshalb bleib ich bei Visual C++. Wie erzeuge ich Methoden?
-
In dem du sie in die IDE eintippst?
Wie gesagt, du kannst deine C++ Funktionen weiter nutzen! - Musst diese nur in eine DLL kompilieren.
Anschließend kannst du diese mittels P/invoke aus C# heraus aufrufen.
Ich hoffe deine Frage bzgl. der Methode war ein Witz...
-
Sind Methoden dass selbe wie Funktionen? Warum sollte ich C# verwenden, wenn ich meine Funktionen ohne probleme und ohne das ich sie in eine Dll Datei packen muss in Visual C++ verwenden kann. Außerdem hab ich mir extra ein Buch zum Visual C++ lernen gekauft. Visual C++ gefällt mir halt.
-
Jim20115 schrieb:
Sind Methoden dass selbe wie Funktionen?
Nicht ganz, aber so etwas ähnliches - Funktionen stehen frei im Raum, Methoden gehören zu einer Klasse.
PS: Was immer du vorhast, entscheide dich bitte für eine Sprache.
-
Ich hab gelesen das der zugrif von einem auf den anderen Thread durch delegate funktionirt. kennt irgendjemand ein gutes Tutorial das beschreibt wie man das mit Visual C++ macht ?
-
Jim20115 schrieb:
Ich hab gelesen das der zugrif von einem auf den anderen Thread durch delegate funktionirt. kennt irgendjemand ein gutes Tutorial das beschreibt wie man das mit Visual C++ macht ?
Ich nehme an dabei geht es um den Zugriff aus einem nicht-UI Thread auf das UI:
Benutze dazu einfach Control::Invoke(..). MSDN hat da mehr Infos und Beispiele findest Du bestimmt auch zu genüge (ev. für C# suchen).
-
Ich hab folgendes Programm geschrieben. Es zeigt eine Textbox und ein Knopf an wenn man auf den Knopf drückt soll ein Thread erzeugt werden. Der aa in die Textbox schreibt. Wenn ich das Programm ausführe und den Knopf drücke hängt sich das Programm auf. Warum hängt es sich auf wo ist der fehler?
#include<Windows.h> #pragma once namespace Thread1 { 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::Windows::Forms::Button^ button1; static System::Windows::Forms::TextBox^ s; protected: public: /// <summary> /// Erforderliche Designervariable. /// </summary> System::ComponentModel::Container ^components; #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->s = (gcnew System::Windows::Forms::TextBox()); this->SuspendLayout(); // // button1 // this->button1->Location = System::Drawing::Point(13, 26); 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::t); // // s // this->s->Location = System::Drawing::Point(35, 98); this->s->Name = L"s"; this->s->Size = System::Drawing::Size(100, 20); this->s->TabIndex = 1; // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(292, 266); this->Controls->Add(this->s); this->Controls->Add(this->button1); this->Name = L"Form1"; this->Text = L"Form1"; this->ResumeLayout(false); this->PerformLayout(); } #pragma endregion delegate void Delg_1(int zahl_1); static void update_1(int zahl_1) { if(Thread1::Form1::s->InvokeRequired) { Thread1::Form1::Delg_1^a=gcnew Delg_1(update_1); a->Invoke(1); } else { Thread1::Form1::s->Text = "aa"; } } static void PR (Object^u) { update_1(1); } private: System::Void t(System::Object^ sender, System::EventArgs^ e) { HANDLE tr; DWORD N; Threading::Thread^ newThread = gcnew Threading::Thread(gcnew Threading::ParameterizedThreadStart(this->PR)); newThread->Start(); ; } }; }
Ich bekomm folgende Fehlermeldung
"Thread.exe" (Verwaltet (v4.0.30319)): "C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll" geladen
"Thread.exe" (Verwaltet (v4.0.30319)): "C:\Thread\11\Release\Thread.exe" geladen, Symbole geladen.
"Thread.exe" (Verwaltet (v4.0.30319)): "C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll" geladen
"Thread.exe" (Verwaltet (v4.0.30319)): "C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll" geladen
"Thread.exe" (Verwaltet (v4.0.30319)): "C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll" geladen
Eine nicht behandelte Ausnahme des Typs "System.StackOverflowException" ist in System.Windows.Forms.dll aufgetreten.Das Programm "[2404] Thread.exe: Verwaltet (v4.0.30319)" wurde mit Code 1073807364 (0x40010004) beendet.
-
Zeile 100 enthält den Fehler.... du machst da was ganz falsches...
Auch solltest Du vermeiden mit statischen Fields/Methoden zu arbeiten... warum machst Du das? Es gibt keinen Grund dafür...
-
Was ist an zeile 100 dert verkert. wenn ich die beiden Funktionen nicht als static kennzeichne wird die updat funktion nicht vom Delegartor angenom. Und ich kann keinen Thread aus einer nicht statischen Funktion bilden weil es dann ebenfals eine Fehlermeldung gibt. Wie mach ich das richtig?
-
Jim20115 schrieb:
Was ist an zeile 100 dert verkert. wenn ich die beiden Funktionen nicht als static kennzeichne wird die updat funktion nicht vom Delegartor angenom. Und ich kann keinen Thread aus einer nicht statischen Funktion bilden weil es dann ebenfals eine Fehlermeldung gibt. Wie mach ich das richtig?
Schau Dir einfach mal an, wie man Delegaten mit nicht-statischen Member Funktionen verbindet.