Button1: Funktion endlos aufrufen, Button2: beendet dies. Wie gehts?



  • 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);)
    		}
    

Anmelden zum Antworten