[c#]Label-Text aus Thread heraus ändern

Ichthys

Grünschnabel
Hi,
ich habe bei mir einen Thread zu laufen, der erst eine ISO-Datei erstellt und dann diese auf CD/DVD brennt. Dies funktioniert auch ganz gut. Leider bekomme ich es nicht hin, aus dem Thread heraus, wenn dieser bestimmte Abschnitte erreicht hat, den Label zu ändern, um so die Fortschritte zu zeigen.

Hier ist der Quelltext:
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using System.Threading;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
       
        public string ordner;
        public string brenner_id;
        public Form1()
        {
            InitializeComponent();
            String[] parms = Environment.GetCommandLineArgs();
            int anzahl = parms.GetUpperBound(0);
            if (anzahl == 0)
            {
                MessageBox.Show("Man soll die Schlacht so nicht starten können, meint Holger");
                Beenden.Visible = true;
                BrennenStarten.Visible = false;
            }
            cdErstellung cd = new cdErstellung();
            if (cd.status == 2)
            {
                MessageBox.Show("eee");
            }

        }



        private string DateiLesen(string cd)
        {

            if (!File.Exists(cd))
            {
                FileStream iii = File.Create(cd);
                iii.Close();
            }
            StreamReader lesen = File.OpenText(cd);
            string d = lesen.ReadToEnd();
            lesen.Close();
            return d;
        }

        private void BrennenVorbereiten_Click(object sender, EventArgs e)
        {

            string Brenner = DateiLesen(Application.StartupPath + "/brenner.dev");
            if (Brenner != "")
            {
                Status_Anzeige.Text = "Erstelle ISO";
                String[] parms = Environment.GetCommandLineArgs();
                int anzahl = parms.GetUpperBound(0);
                string ZielSicherung = "";
                for (int i = 1; i <= anzahl; i++)
                {
                    ZielSicherung = ZielSicherung + " " + parms[i].Substring(5);
                }
                cdErstellung cdKlasse = new cdErstellung();
                cdKlasse.ordner = ZielSicherung;
                cdKlasse.brenner_id = Brenner;
                ThreadStart ISO = new ThreadStart(cdKlasse.cdBrennen);
                Thread isoErstellen = new Thread(ISO);
                isoErstellen.Start();
                BrennenStarten.Visible = false;
                Beenden.Visible = true;

            }
            else
            {
                Brenner brenner = new Brenner();
                brenner.Show();
            }

        }
        
        private void process1_Exited(object sender, EventArgs e)
        {
        }



        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void IsoErstellung_Exited_1(object sender, EventArgs e)
        {

        }

        private void Beenden_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        

    }
    public class cdErstellung
    {
        public string ordner;
        public string brenner_id;
        public int status;
        public void cdBrennen()
        {
            Form1 formular = new Form1();
            ProcessStartInfo Vorbereitung = new ProcessStartInfo("\"" + Application.StartupPath + "/mkisofs.exe\"", " -r -J -o \"" + Application.StartupPath + "/daten.iso \" " + ordner);
            Vorbereitung.WindowStyle = ProcessWindowStyle.Hidden;
            Process.Start(Vorbereitung).WaitForExit();
            formular.Status_Anzeige.Text = "brenne CD";
            ProcessStartInfo cdbrennen = new ProcessStartInfo(Application.StartupPath + "/cdrecord.exe", "-tao -v dev=" + brenner_id + " speed=4 \"" + Application.StartupPath + "/daten.iso\"");
            cdbrennen.WindowStyle = ProcessWindowStyle.Hidden;
            Process.Start(cdbrennen).WaitForExit();
            MessageBox.Show("CD erstellt");
        }

    }
}
Das seltsame ist, dass sich der Compiler nicht beschwert. Er ignoriert anscheinend einfach die Anweisungen.
 
Hi

Du instanziierst in der Klasse für die Erstellung die Form neu und arbeitest auf dieser weiter (nur im Speicher).
Wenn du deine Hauptform darin nutzen willst, musst du diese an deine Klasse übergeben (z.B. im Konstruktor). So wie du es derzeit hast, kennt die Klasse nicht die Form, die sie aufgerufen hat.
 
Zurück