wie thread anlegen in .net
-
hallo
ich möchte gern einen neuen thread anlegen in visual c++ 2005 - wie mach ich das am einfachsten? - habe schon folgendes Bsp.ergoogelt:
#using <mscorlib.dll> using namespace System; using namespace System::Threading; __gc class Work { Work() {} public: static void DoWork() {} }; void main() { Thread* newThread = new Thread(new ThreadStart(0, &Work::DoWork)); newThread->Start(); }
hier kommt beim debuggen aber immer der error bei "Thread* newThread"
error C3699: '*' : cannot use this indirection on type 'System::Threading::Thread' c:\projects.net\Form1.h
Wieso geht das nicht bzw gibts da vl.ein einfacheres Beispiel dazu?
-
Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ 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.
-
Für mich sieht es aus, als verwendest Du nicht C++/CLI, sondern Managed Extensions for C++ (die veraltete Syntax).
Siehe: http://en.wikipedia.org/wiki/C%2B%2B/CLIVeruchs mal so:
#using <mscorlib.dll> using namespace System; using namespace System::Threading; ref class Work { Work() {} public: static void DoWork() {} }; int main() { Thread^ newThread = gcnew Thread(gcnew ThreadStart(0, &Work::DoWork)); newThread->Start(); newThread->Join(); return 0; }
Simon
-
wie wäre den der neue Syntax?
Ich bräuchte einfach nur mal ein kleines Besiepiel wo ein neuer Thread angelegt wird und was irgedwas macht...
-
CyberAnt schrieb:
wie wäre den der neue Syntax?
So wie dem von Simon.
-
oh hab ich ja gar nicht so genau hingeschaut - danke -werd gleich mal testen
-
Also ich hab das jetzt umgesetzt mit dem thread aber es hat sich ein neues Problem ergeben:
Ich hab ein Windows Form Programm (mit einer Textbox), in welchem ich onLoad einen Thread laufen lasse. Im Thread läuft eine Endlosschleife die ab und zu mal etwas in einer Textbox im GUI hinzufügen soll. Die endlosschleife ist in einer extra *.cpp datei und dem gui über eine header datei mitgeteilt.
Ich kann jetzt aber aus dem Thread nicht auf die Textbox im GUI zugreifen - wie geht das? - hoffe konnte mir noch jemand folgen...
-
Bin mir nicht sicher was dein Problem ist.
Ev. die Thread Affinität der Fenster unter Windows.
Suche dazu im Internet nach Control::Invoke...
Invoke marshalled the Aufruf auf den korrekten (GUI) Thread.Was ist denn der Fehler überhaupt??
Ich kann jetzt aber aus dem Thread nicht auf die Textbox im GUI zugreifen
Ist schon ein wenig eine dürftige Aussage...
Simon
-
also nochmal mein zugriffsproblem ein bisschen ausführlicher:
ich habe eine Windows Form Applikation mit einer TextBox und die Funktion SchreibeInTextBox in der Form1.h - diese funktioniert auch(solang sie auch innerhalb von Demo aufgerufen wird:
#pragma once #include "FW.h" namespace Demo { 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; public ref class Form1 : public System::Windows::Forms::Form { public: void SchreibeInTextBox() //void SchreibeInTextBox(char*) { this->textBox1->AppendText("TEST"); } ...
Parallel zum oben stehenden GUI läuft ein Thread der die Funktion send() aufruft - welche ich in einer extra *.cpp datei stehen habe.
Inhalt:#include "stdafx.h" #include "Form1.h" void Send() { DemoModul2008::Form1::SchreibeInTextBox();//ERZEUGT FEHLERMELDUNG }
Dies erzeugt mir jetzt aber den Fehler:
error C2352: 'DemoModul2008::Form1::SchreibeInTextBox' : illegal call of non-static member function
Wenn ich die SchreibeInTextBox als static deklarier kann ich aber wieder nicht mehr auf die textBox1 zugreifen...
Wie mach ich das jetzt?
-
Das ist (meiner Meinung nach) ein klassisches Anfänger Problem.
Lerne den Unterschied zwischen Klassen und Objekten.
(Und dann wahrscheinlich noch was Pointer, Referenzen, Variablen, etc. sind.)Konkret benötigst Du für dein Problem eben eine Instanz (ein Objekt) der Klasse Form1. Eine Instanz dieser Klasse wurde im, vom VS, generierten Code angelegt und an die Klasse Application::Run(...) übergeben. dort steht irgendwo gcnew Form1(..).
Das ist genau das Objekt das Du benötigst.Es ist keine Lösung die Methode SchreibeInTextBox() static zu machen. Das ist nicht der Sinn der Sache.
Simon
-
ja da steht
Application::Run(gcnew Form1());
im vom Visual generierten hauptprogramm.
und wie komm ich nun im Unterprogramm da an SchreibeInTextBox() ran?(in der geposteten Send funktion)
Form1()::SchreibeInTextBox();
geht nicht... ( genausowenig wie . oder ->)
(wie das mit objekten und klassen funktioniert ist mir normalerweise schon klar...)
-
(wie das mit objekten und klassen funktioniert ist mir normalerweise schon klar...)
Entschuldige, aber es kommt mir nicht so vor.
Eine Möglichkeit ist wohl über Application::OpenForms an deine Form1 Instanz zu kommen.
http://msdn2.microsoft.com/en-us/library/system.windows.forms.application.openforms.aspx
Simon
-
Wer möchte denn Send aufrufen???
Eine andere Möglichkeit wäre:
void Send(DemoModul2008::Form1^ form1) { form1->SchreibeInTextBox(); }
Jedoch hast Du dann wieder dasselbe Problem wie vorher einfach an einer anderen Stelle... Du brauchst ein Form1 Objekt.
-
Das send wird im Thread aufgerufen.
Darin läuft ein endlos while schleife und unter bestimmten bedingungen erfolgt halt das Send() - das funktioniert auch - blos ich komm im Send wie gesagt nicht an die SchreibeTextBox()...
Muss schon auch irgendwie mit dem Invoke zu tun haben weil man ja auch von nem andren thread aufs GUI zugreift...
Wie würde das mit dem Application::OpenForms bei mir aussehen?
-
Du hast zwei Probleme zu lösen.
1. Es muss Kompilieren und 2. zur Laufzeit darf nur der Thread auf dem das Fenster erstellt wird zugreifen.Sowie ich das sehe, scheiterst Du an Problem 1.
Problem 2. zeigt sich erst zur Laufzeit. Abhilfe schafft hier die Invoke Methode der Form1.Warum hast Du einen Nicht-GUI-Thread ?? Poste doch mal ein wenig Code für den Aufruf von Send. Wo ist der Thread ??
Simon
-
Hast recht ich scheiter zur zeit noch am kompilieren.
Ja ich brauche den nicht gui thread weil darin eine endlosschleife mit verschienden bedingungen drin laufen muss und sonst das eigentliche GUI ja "hängen" würde.
wie gesagt das aufrufen von send() funzt und der thread läuft.
Ich fass nochmal zusammen:
Form1.h:
#pragma once #include "FW.h" namespace Demo { 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; public ref class Form1 : public System::Windows::Forms::Form { public: void SchreibeInTextBox() //void SchreibeInTextBox(char*) { this->textBox1->AppendText("TEST"); } ... ref class Work { Work() {} public: static void DoWork() { //MessageBox::Show("This is the main thread"); mainFW(); } }; private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { Thread^ newThread = gcnew Thread(gcnew ThreadStart(&Work::DoWork)); newThread->Start(); }
mainFW.cpp:
#include "stdafx.h" void mainFW(void) { while(true) { ... if (bedingung) Send(); ... } }
senden.cpp:
#include "stdafx.h" #include "Form1.h" void Send() { Demo::Form1::SchreibeInTextBox();//ERZEUGT FEHLERMELDUNG }
Es wird also beim laden der Form1 eiun thread gestartet in dem eine endlosschleife läuft und unter bestimmten bedingungen(spielen ja jetzt keine rolle) wird send() aufgerufen.
Wie mach ich das jetzt am besten? bzw. wie komm ich ans SchreibeInTextBox? bzw. wie komm ich in senden.cpp an das Form1 objekt ran?