Button1: Funktion endlos aufrufen, Button2: beendet dies. Wie gehts?
-
Dass das erst beendet werden muss erklärt das Verhalten, ok.
Danke für die Info und die zwei Stichworte, nach denen ich jetzt mal suchen werde...
-
So, jetzt habe ich im Internet nach den threads gesucht, einiges gelesen und viel herumprobiert.
Das Projekt lässt sich nun ohne Fehler oder Warnungen kompilieren, aber irgendwas klappt nicht so ganz.
Ich habe auch schon eine Idee wo es dran liegen könnte, aber bräuchte jetzt doch noch mal eure Hilfe.Der Übersichtlichkeit halber möchte ich den Code den ich programmiere nicht in der Form1.h mehr haben, sondern dort nur bei den click-Funktionen die Funktionen in einer anderen .cpp starten.
"Form1.h" hat jetzt nur noch die Aufgabe die Funktionen in "threads.cpp" zu starten.
Das klappt soweit auch ganz gut, der Code läuft fehlerfrei und vollständig durch.
Allerdings bekomme ich auf Form1 keine Ausgabe...Der Start-Button auf Form1:
private: System::Void btnStart_Click(System::Object^ sender, System::EventArgs^ e) { ThreadsGUI::ThreadClass EntityThreads; Thread^ oThread = gcnew Thread( gcnew ThreadStart( &ThreadsGUI::ThreadClass::ThreadProc) ); oThread->Start(); }
Und der thread in "threads.cpp":
void ThreadClass::ThreadProc() { MeineGUI::Form1 EntityForm1; int Text = Convert::ToInt32(EntityForm1.TextBox1->Text); EntityForm1.TextBoxTest->Text = ("Diese Zahl stand in TextBox1: {0}", Text); };
Meine Vermutung ist, dass ich mit den Instanzen nicht auf der Form1 "schreiben" kann.
Die TextBox ist in Form1.h auf "public" gesetzt, aber dennoch gehts nicht.Könnt ihr mir da verraten wie das gehen könnte?
Danke.
-
Ich komme nicht weiter, wäre schön wenn mir jemand helfen könnte.
Danke.
-
Schau mal welche Exception fliegt und prüfe mal ob Du nicht eventuell mit Invole arbeiten musst.
-
Da fliegt keine Exception.
Wie gesagt, auf der Form wird einfach nichts in der Textbox angezeigt, der code läuft ohne Fehler.
-
Knuddlbaer schrieb:
Schau mal welche Exception fliegt und prüfe mal ob Du nicht eventuell mit Invole arbeiten musst.
Ich habe jetzt mal den Code (den thread) aus der "threads.cpp" wieder herausgenommen und in die "Form1.h" gesetzt, die "threads.cpp" entfernt.
Testweise.Jetzt kommt auch eine Exception-Meldung:
Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement TextBox1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.Die kommt nicht, wenn ich den thread in "threads.cpp" setze.
In beiden Fällen wird jedenfalls auf der Form nichts verändert.Weiterhin ist mir aufgefallen, dass im Code von Button-Start_click der thread-Start mit zwei Parametern, bei der Auslagerung in "threads.cpp" aber nur mit einem Parameter angegeben werden soll.
Thread^ oThread = gcnew Thread( gcnew ThreadStart(this, &MeineGUI::Form1::ThreadProc) );
Zum Invoke habe ich jetzt einiges gelesen, aber ich verstehe es irgendwie nicht...
Wie kann ich jetzt den Text der Textbox verändern?
(Und das am liebsten so, dass der thread in einer "threads.cpp" ist, und nicht in Form 1.)
-
Ich kriegs einfach nicht hin...
Kann mir bitte jemand helfen, wie ich den Zugriff auf die Textbox in Form1 vom thread in der anderen .cpp hinbekomme?
Danke.*EDIT:
Nach tagelangem Suchen und Probieren:
Das hier bei Form1.h einfügen:this->TextBox1->CheckForIllegalCrossThreadCalls::set(false);
Außerdem den thread wieder in die Datei mit rein.
Solange man nicht mehrere threads verwendet die auf das selbe Steuerelement zugreifen sollte das keinen Ärger machen und funktionieren!Ich hoffe, dass wenigstens der nächste mit dem Problem schneller fündig wird...
Gruß*
-
@nibbler Wie geil, genau das was ich suche!
u
nd ich hab schon sonst was probiert. und jetzt die eine zeile!!
-
Freut mich zu hören, dass das jemandem geholfen hat.
Wollte das tagelange Probieren wenigstens anderen ersparen...Allerdings habe ich jetzt einen schönen Effekt, wenn ich den Ansicht-Designer für die Form1 aufrufe, weil da kommt ne Fehlermeldung:
Beim Laden des Designers sind die nachfolgend aufgeführten Fehler aufgetreten. Einige können durch Neuerstellen des Projekts behoben werden, andere erfordern möglicherweise Änderungen am Code. C++ CodeDOM parser error: Line: 166, Column: 49 --- Member CheckForIllegalCrossThreadCalls not found in class System.Windows.Forms.TextBox bei Microsoft.VisualC.CppCodeParser.OnMethodPopulateStatements(Object sender, EventArgs e) bei System.CodeDom.CodeMemberMethod.get_Statements() bei System.ComponentModel.Design.Serialization.TypeCodeDomSerializer.Deserialize(IDesignerSerializationManager manager, CodeTypeDeclaration declaration) bei System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager manager) bei Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager serializationManager) bei System.ComponentModel.Design.Serialization.BasicDesignerLoader.BeginLoad(IDesignerLoaderHost host)
Hast du die auch?
Frage an alle:
Was außer die Codezeile ( this->TextBox1->CheckForIllegalCrossThreadCalls::set(false); ) für die Verwendung des Designers auszukommentieren hilft gegen das Problem?
-
nö, bei mir hat sich nix weiter verändert
-
Hast du die Zeile vlt in die InitializeComponents Methode des Designers eingefügt? Dann passiert nämlich unter Umständen sowas...
Füg sie doch nach dieser Methode in den Ctor ein...
-
Danke Dappeljuh, das war genau der Fehler!
EDIT:
Ich habe die jetzt woanders in Form1.h stehen, aber jetzt kopiliert das Projekt deshalb nicht mehr... (Fehler C2059 und C2238)Wohin genau soll das?
OK, geht. Habs jetzt hier:
public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: Konstruktorcode hier hinzufügen. // this->TextBox1->CheckForIllegalCrossThreadCalls::set(false);) }