Label durch Event updaten



  • Hallo, ich möchte für meinen PDA eine Anwendung schreiben, die Daten sammelt und diese dann auf dem Bildschirm ausgibt. Meine Idee ist die Daten in einem separaten Thread zu sammeln und diese dann per Event an die Form zu senden. Zu Testzwecken habe ich mir eine Form mit einem Label und einem Button erzeugt und den Thread hinzugefügt. Das ganze sieht in Etwa folgendermaßen aus:

    namespace MyFirstApp
    {
        public partial class Form1 : Form
        {
            Thread firstThread = null;
            hasEvent x = null;
            private uint uiData = 0;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void updateMainLabel(object sender, EventArgs e)
            {
                mainLabel.Text = uiData.ToString();
            }
    
            private void startButton_Click(object sender, EventArgs e)
            {
                if (x == null)
                {
                    x = new hasEvent();
                    x.sampleEvent += new EventHandler(updateMainLabel);
                    firstThread = new Thread(new ThreadStart(x.fireEvent));
                    firstThread.Start();
                }
            }
        }
        public class hasEvent
        {
            public event EventHandler sampleEvent;
    
            public void fireEvent()
            {
                sampleEvent(this, EventArgs.Empty);
            }
        }
    }
    

    Nun zu meiner Frage: die Geschichte mit dem Event scheint zu klappen, die Methode "updateMainLabel" wird ausgeführt, jedoch bekomme ich innerhalb dieser Methode (bei der Zuweisung des Textes an das Label) folgende Fehlermeldung: "An unhandled exception of type 'System.NotSupportedException' occurred in System.Drawing.dll
    Additional information: An error message cannot be displayed because an optional resource assembly containing it cannot be found".

    Wenn das Event, welches die "updateMainLabel"-Methode anstößt innerhalb der selben Klasse liegt, tritt dieses Problem interessanterweise nicht auf.

    Hat vielleicht jemand eine Idee was ich da falsch mache?

    Gruß Blackfin.



  • Schau Dir mal die Methode Invoke von Control an. Ruf den Delegaten damit auf, dann kannst Du die GUI auch updaten.



  • Danke, ich hatte mir schon gedacht, dass das Problem mit der Synchronisierung der Threads zusammenhängt.

    Gruß Blackfin



  • Vorher am besten immer per 'if (InvokeRequired)' testen, ob der Umweg über 'Control.Invoke' überhaupt notwendig ist. Also nach folgendem Schema:

    private void UpdateProc() // Generische Methode, die die GUI beeinflussen soll.
    {
        if (InvokeRequired) {
            Invoke(new MethodInvoker(UpdateProc));
            return;
        }
    
        // Eigentliche Operation.
    }
    

Anmelden zum Antworten