wie thread anlegen in .net
-
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?