Schleife stürzt ab! Windows Forms

Okay das hab ich schon hinbekommen, aber jetzt noch zu meiner fehlermeldung und zwar:

Code:
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.

Gruß
 
Hallo,

ja, innerhalb der der Schleife (in BackgroundWorker_DoWork) kannst du nicht ohne weiteres auf Controls zugreifen. Wann willst du denn die Textbox aktualisieren?
Wenn sie nur am Ende aktualisiert werden soll, schreibe das Ergebnis in eine Member-Variable und erledige in "BackgroundWorker_RunWorkerCompleted" die Zuweisung an die Textbox.
Falls es zwischendrin passieren soll, musst du zusätzlich noch den ProgressChanged-Event verwenden.

Gruß
MCoder
 
Also es muss zwischen durch passieren...is so ne art log-funktion...ähm könntest du mir kurz beispiel geben?:)

Danke!
 
Ich habe meinen zuletzt geposteten Code etwas aufgebohrt:
C++:
#pragma once

namespace WinFormsApp
{
	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Windows::Forms;

	public ref class Form1 : public System::Windows::Forms::Form
	{
	public:
		Form1(void)
		{
	    	InitializeComponent();
	    	
            Worker = gcnew System::ComponentModel::BackgroundWorker();
            Worker->DoWork             += gcnew DoWorkEventHandler(this, &Form1::BackgroundWorker_DoWork );
            Worker->RunWorkerCompleted += gcnew RunWorkerCompletedEventHandler(this, &Form1::BackgroundWorker_RunWorkerCompleted);
            Worker->ProgressChanged    += gcnew ProgressChangedEventHandler( this, &Form1::BackgroundWorker_ProgressChanged );
            Worker->WorkerReportsProgress = true;
		}

	protected:
		~Form1()
		{
            if (components)
			{
				delete components;
			}
		}
    private: System::Windows::Forms::Button^  button1;
    private: System::Windows::Forms::TextBox^  textBox1;
    protected: 

	private:
		System::ComponentModel::Container ^components;
		System::ComponentModel::BackgroundWorker ^Worker; 
		System::String ^ergebnis;

    #pragma region Windows Form Designer generated code
		void InitializeComponent(void)
		{
            this->button1 = (gcnew System::Windows::Forms::Button());
            this->textBox1 = (gcnew System::Windows::Forms::TextBox());
            this->SuspendLayout();
            // 
            // button1
            // 
            this->button1->Location = System::Drawing::Point(21, 31);
            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::OnClickButton);
            // 
            // textBox1
            // 
            this->textBox1->Location = System::Drawing::Point(114, 33);
            this->textBox1->Name = L"textBox1";
            this->textBox1->Size = System::Drawing::Size(151, 20);
            this->textBox1->TabIndex = 1;
            // 
            // Form1
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(277, 83);
            this->Controls->Add(this->textBox1);
            this->Controls->Add(this->button1);
            this->Name = L"Form1";
            this->Text = L"Form1";
            this->ResumeLayout(false);
            this->PerformLayout();
        }
    #pragma endregion

    private:
        void BackgroundWorker_DoWork( Object^ sender, DoWorkEventArgs^ e )
        {
            for( int i = 0; i < 100; i++ )
            {
                System::Threading::Thread::Sleep(100);
            
                ergebnis = String::Format("Fortschritt: {0}", i);
                Worker->ReportProgress(0);
            }
        }
 
        void BackgroundWorker_RunWorkerCompleted( Object^ sender, RunWorkerCompletedEventArgs^ e )
        {
            textBox1->Text = "Fertig";
        }
        
        void BackgroundWorker_ProgressChanged( Object^ sender, ProgressChangedEventArgs^ e )
        {
            textBox1->Text = ergebnis;
        }
        
        private: System::Void OnClickButton(System::Object^  sender, System::EventArgs^  e)
        {
            Worker->RunWorkerAsync();
        }
    };
}
Gruß
MCoder
 
Also denke ich habe alle änderungen eingefügt, doch leider schreibt er nix in die textbox...also normaler weise hatte ich einen Stringen der jedes mal neu in die textbox mit:

Code:
textBox2->AppendText(link);

so und jetzt habe ich diese zeile einfach weggenommen und dafür hingeschrieben:

Code:
ergebnis=link;
und habe dann unten bei ProgressChanged das eingefügt:

Code:
textBox2->AppendText(ergebnis);

so aber es t net:(
 
Versuche mal zu debuggen und schaue, was bei den einzelnen Variablen (link, ergebnis) zugewiesen wird.

//EDIT: Springt das Programm überhaupt in "BackgroundWorker_ProgressChanged" hinein? Wichtig ist die Zeile "Worker->ReportProgress(0); ".

Gruß
MCoder
 
Zuletzt bearbeitet:
Morgen, sry das ich net mehr geantwortet hatte, aber hatte letzte woche viel zu tun:mad::rolleyes:...

so habe immer noch das problem...und ich glaube es liegt daran das der backupworker überhaupt gar nicht gestartet wird...hmmm

Gruß
 
Okay hab mich geirrt...also der backupworker läuft auf jeden fall...nur mit dem log stimmt irgendwas net...nichtmal wenn ich die variable direkt bei ProgressChanged definiere...also ergebnis="Hallo"; t es net...obwohl er ja jetzt min. das hallo ausgeben müsste...

Gruß
 
So das Problem hat sich auch erledigt...also es t...jetzt habe ich nur ein problem...und zwar beim log soll er ja jeden einzelnen Wert anzeigen: Bsp: for-schleife von 0-10

er soll anzeigen in der textbox während die schleife läuft:

Code:
0
Code:
0
1
Code:
0
1
2

aber erzeigt nach dem schleife durch is...NUR den letzen Wert an:

Code:
10
 

Neue Beiträge

Zurück