Announcement

Collapse
No announcement yet.

Thread Klasse zur Aktualisierung von GUI Komponenten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Thread Klasse zur Aktualisierung von GUI Komponenten

    hallo zusammen,

    ich habe hier eine extra Klasse erstellt für eine Thread. Dieser Thread greift auf eine Methode der GUI Klasse zu um bestimmte GUI Komponenten zu verändern. Jetzt möchte ich in dieser "Thread" Klasse einen weiteren Thread laufen lassen, der ebenfalls auf eine Methode aus der GUI Klasse zugreift. Allerings auf eine andere Methode mit anderen Parameter.

    Da ich schon eine delegatevoid UpdateUI habe, kann ich kein weiteres definieren. Bräuchte ich aber! Hat jemand eine Idee?

    delegate void UpdateUI(int patientMonitorIndex);


    Code:
        class GUIUpdate
        {
            private GUI gui;
            private FileHandler filehandle;
    
            public Thread initialize(GUI gui, FileHandler filehandle)
            {
                this.gui = gui;
                this.filehandle = filehandle;
    
                return new Thread(new ThreadStart(this.UpdateChart));
            }
    
            delegate void UpdateUI(int patientMonitorIndex);
    
            public void UpdateChart()
            {
                UpdateUI updateUI = new UpdateUI(this.gui.updatePatientMonitorChart);
    
                while (true)
                {
                    // Interval alle 30 sek
                    System.Threading.Thread.Sleep(30000);
                    // Logfile
                    filehandle.WriteToFile("thread.txt", 1, DateTime.Now.ToString() + " - Ereignis: Beginn Update GUI chart", false);
                    try
                    {

  • #2
    Hi,

    hört sich ziemlich kompliziert an. Da musst du aufpassen dass du den Überblick nicht verlierst .

    Für solche Vorgehen eignet sich der BackgroundWorker gut.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      wenn ich einen backgroundworker in meiner Gui einsetze, dann läuft doch dieser im hintergrund, d.h. der user kann weiterhin die gui bedienen. oder???

      Comment


      • #4
        Richtig.

        Aber das ist mit Threads auch so. Ein Backgroundworker erleichtert nur die Arbeit. Bei Threads muss für Änderungen Invoke... aufgerufen werden. Beim Backgroundworker wird das über Ereignisse vereinfacht.

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Backgroundworker

          wenn ich einen Chart damit aktualisierne will kommt weiterhin, das dies nicht möglich ist, da der Chart in einem anderen Thread angelegt wurde.

          wenn ich jedohc labels verändern möchte geht das mit einem Backgroundworker!

          Warum?

          Comment


          • #6
            Antwort:
            da der Chart in einem anderen Thread angelegt wurde.
            Jeder Threads besitzt seinen eigenen Stack und dieser kann von "außen" nicht zugegriffen werden.
            Das Chart wird wie die Fehlermeldung indiziert in einem anderen Thread ausgeführt als der GUI-Thread. Somit hat der Backgroundworker keine Chance.

            Lerneffekt: Gleich bei der Frage genau angeben was man will.

            Lösung: Schau dir die Methode Control.Invoke an.

            mfG Gü
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment


            • #7
              versteh aber nicht warum der Chart in einem anderen Thread angelegt wurde. Ist alles in der GUI Klasse. Der Backgroundworker kann beispielsweise einen TreeView ändern aber eben den Chart nicht. Die TreeView und der Chart sind in der selben Klasse also, dem selben Thread...

              Comment


              • #8
                ich glaube eher das ist das Problem:


                Error 1 'System.Windows.Forms.DataVisualization.Charting.C hart' does not contain a definition for 'myDelegate' and no extension method 'myDelegate' accepting a first argument of type 'System.Windows.Forms.DataVisualization.Charting.C hart' could be found (are you missing a using directive or an assembly reference?) E:\ai\ai 4\Projekt 1\Implementierung\ArztClient\Care At Home\GUI.cs 1178 44 Care At Home

                Comment


                • #9
                  das war nix...

                  kannst du mir einen Tip geben wie das mit Invoke geht. Wäre sehr hilfreich! Hatte ursprünglich eine extra Klasse dafür, dort habe ich es mit Invoke und Delegate gemacht. Wollte jetzt aber den Backgroundworker verwenden. Hier bekomme ich es leider nicht hin!

                  Comment


                  • #10
                    versteh aber nicht warum der Chart in einem anderen Thread angelegt wurde.
                    Das war eine falsche Schlussfolgerung meinerseits aufgrund deiner Fehlermeldung. Chart läuft schon im UI-Thread.

                    Folgendes Beispiel gibt MS an:

                    [highlight=c#]
                    using System;
                    using System.Drawing;
                    using System.Threading;
                    using System.Windows.Forms;
                    using System.Windows.Forms.DataVisualization.Charting;

                    namespace WindowsFormsApplication1
                    {
                    public partial class Form1 : Form
                    {
                    private Thread addDataRunner;
                    private Random rand = new Random();
                    public delegate void AddDataDelegate();
                    public AddDataDelegate addDataDel;
                    private DateTime minValue;
                    private DateTime maxValue;

                    public Form1()
                    {
                    InitializeComponent();

                    // create the Adding Data Thread but do not start until start button clicked
                    ThreadStart addDataThreadStart = new ThreadStart(AddDataThreadLoop);
                    addDataRunner = new Thread(addDataThreadStart);

                    // create a delegate for adding data
                    addDataDel += new AddDataDelegate(AddData);

                    }

                    private void button1_Click(object sender, EventArgs e)
                    {
                    // Disable all controls on the form
                    startTrending.Enabled = false;
                    // and only Enable the Stop button
                    stopTrending.Enabled = true;

                    // Predefine the viewing area of the chart
                    minValue = DateTime.Now;
                    maxValue = minValue.AddSeconds(120);

                    chart1.ChartAreas[0].AxisX.Minimum = minValue.ToOADate();
                    chart1.ChartAreas[0].AxisX.Maximum = maxValue.ToOADate();

                    // Reset number of series in the chart.
                    chart1.Series.Clear();

                    // create a line chart series
                    Series newSeries = new Series("Series1");
                    newSeries.ChartType = SeriesChartType.Line;
                    newSeries.BorderWidth = 2;
                    newSeries.Color = Color.OrangeRed;
                    newSeries.XValueType = ChartValueType.DateTime;
                    chart1.Series.Add(newSeries);

                    // start worker threads.
                    if (addDataRunner.IsAlive == true)
                    {
                    addDataRunner.Resume();
                    }
                    else
                    {
                    addDataRunner.Start();
                    }

                    }

                    private void button2_Click(object sender, EventArgs e)
                    {
                    if (addDataRunner.IsAlive == true)
                    {
                    addDataRunner.Suspend();
                    }

                    // Enable all controls on the form
                    startTrending.Enabled = true;
                    // and only Disable the Stop button
                    stopTrending.Enabled = false;

                    }

                    /// Main loop for the thread that adds data to the chart.
                    /// The main purpose of this function is to Invoke AddData
                    /// function every 1000ms (1 second).
                    private void AddDataThreadLoop()
                    {
                    while (true)
                    {
                    chart1.Invoke(addDataDel);

                    Thread.Sleep(1000);
                    }
                    }

                    public void AddData()
                    {
                    DateTime timeStamp = DateTime.Now;

                    foreach (Series ptSeries in chart1.Series)
                    {
                    AddNewPoint(timeStamp, ptSeries);
                    }
                    }

                    /// The AddNewPoint function is called for each series in the chart when
                    /// new points need to be added. The new point will be placed at specified
                    /// X axis (Date/Time) position with a Y value in a range +/- 1 from the previous
                    /// data point's Y value, and not smaller than zero.
                    public void AddNewPoint(DateTime timeStamp, System.Windows.Forms.DataVisualization.Charting.Se ries ptSeries)
                    {
                    double newVal = 0;

                    if (ptSeries.Points.Count > 0)
                    {
                    newVal = ptSeries.Points[ptSeries.Points.Count - 1].YValues[0] + ((rand.NextDouble() * 2) - 1);
                    }

                    if (newVal < 0)
                    newVal = 0;

                    // Add new data point to its series.
                    ptSeries.Points.AddXY(timeStamp.ToOADate(), rand.Next(10, 20));

                    // remove all points from the source series older than 1.5 minutes.
                    double removeBefore = timeStamp.AddSeconds((double)(90) * (-1)).ToOADate();
                    //remove oldest values to maintain a constant number of data points
                    while (ptSeries.Points[0].XValue < removeBefore)
                    {
                    ptSeries.Points.RemoveAt(0);
                    }

                    chart1.ChartAreas[0].AxisX.Minimum = ptSeries.Points[0].XValue;
                    chart1.ChartAreas[0].AxisX.Maximum = DateTime.FromOADate(ptSeries.Points[0].XValue).AddMinutes(2).ToOADate();

                    chart1.Invalidate();
                    }

                    /// Clean up any resources being used.
                    protected override void Dispose(bool disposing)
                    {
                    if ((addDataRunner.ThreadState & ThreadState.Suspended) == ThreadState.Suspended)
                    {
                    addDataRunner.Resume();
                    }
                    addDataRunner.Abort();

                    if (disposing)
                    {
                    if (components != null)
                    {
                    components.Dispose();
                    }
                    }
                    base.Dispose(disposing);
                    }

                    }
                    }
                    [/highlight]

                    Also ganz normal mittels Invoke.

                    mfG Gü
                    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                    Comment

                    Working...
                    X