Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Viper2000
Thema: Problem: GUI/Workerthread
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Also ich bin gerade nicht am Rechner sondern mit dem Handy Online auf der Couch. Ansonsten hätte ich es mal direkt probiert. Also ich erstelle mir einen eigenen Delegaten und spare mir dann den "MethodInvoker" und rufe direkt den Delegaten innerhalt der Invoke Methode auf...korrekt?!

Thema: Problem: GUI/Workerthread
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hey herbivore,

danke für die Antwort!
Ich habe mich mal eingelesen aber noch nicht alles komplett verstanden.
Ich habe jetzt mal eine funktionierende Lösung die in meinem Augen abe rnicht optimal ist.

Habe eine Abfrage gemacht ob ein Invoke benötigt wird und dann per "new MethodInvoker( testMethod )" eine zusätzlich erstellte Methode Angestoßen.

Es läuft also so:
Der Workerthread gibt jedes mal wenn er was vom Netzwerk empfängt einen String an seine CallBack-Methode zurück. Dort wird der String in eine globale Variable gespeichert, da ich an meine Methode die ich per MethodInvoker anstoße keine Parameter übergeben kann. Finde das nicht so optimal.
Kannst du mir vielleicht noch etwas auf die Sprünge helfen wie es eleganter zu lösen ist?!

Hier mein Code(der auch jetzt funktioniert aber Stilecht ist):


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace xxxxxx
{
    public partial class Form1 : Form
    {
        NetworkThread nwt;
        Thread thr1;
        string text;

        public Form1()
        {
            InitializeComponent();

            nwt = new NetworkThread(514, new MyCallback(LogParse));
            thr1 = new Thread( new threadStart(nwt.Starte) );
        }

        private void button_startLog_Click(object sender, EventArgs e)
        {
            button_startLog.Enabled = false;
            button_stopLog.Enabled = true;

            if (thr1.IsAlive == false)
                thr1.Start();
            else
                thr1.Resume();

            //Console.WriteLine("LOS GEHT ES");
        }

        private void button_stopLog_Click(object sender, EventArgs e)
        {
            button_startLog.Enabled = true;
            button_stopLog.Enabled = false;

            if (thr1.IsAlive == true)
                thr1.Suspend();
        }

        public void LogParse(string log)
        {
           text = log;
           if (textBox1.InvokeRequired())
               textBox1.Invoke( new MethodInvoker(test) );

           //Console.WriteLine(log);
           //textBox1.AppendText(log);
        }
        
        private void test()
        {
            textBox1.AppenText(text);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Start();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            Console.WriteLine(thr1.ThreadState.ToString());
        }


    }
}

Viele Grüße

Thema: Problem: GUI/Workerthread
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi Community,

ich habe ein Problem, Habe mal angefangen mit Threads zu experimentieren. Ich habe einen Thread der aus dem GUI-Thread(Mainthread) heraus gestartet wird. Dieser Thread sammelt fortlaufend UDP-Datagramme auf einer Netzwerkschnittstelle.

Das klappt auch soweit ganz gut. Allerdings möchte ich diese Daten aus dem Thread in einem Textfield in der GUI anzeigen lassen. Dazu übergibt der Thread einfache Strings über eine Callback Funktion an den Mainthread. Wenn ich diese in der Callback Funktion im Mainthread in das Textfeld der GUI eintragen will sagt der Debugger, dass aus einem fremden Thread nicht auf die GUI zugegriffen werden darf.

Hier einfach mal meine Codefiles:

Erstmal der Workerthread:


using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace xxxxxx
{
    class NetworkThread
    {
        private int port;
        private MyCallback back;
       

        //KONSTRUKTOR
        public NetworkThread(int iPort, MyCallback iCallback)
        {
            port = iPort;
            back = iCallback;
        }

        //Start-Methode
        public void Starte()
        {
            int inputB;
            string inputS;
            byte[] puffer = new byte[256];

            IPEndPoint ep = new IPEndPoint(IPAddress.Any, port);
            Socket mySocket = new Socket(AddressFamily.InterNetwork,
                                  SocketType.Dgram,
                                  ProtocolType.Udp);
            mySocket.Bind(ep);

            try
            {
                while((inputB = mySocket.Receive(puffer)) != 0)
                {
                    inputS = Encoding.UTF8.GetString(puffer, 0, inputB);
                    
                    puffer = new byte[512];
                    back(inputS);
                }
            }
            catch (Exception ex)
            {
                SocketException mySocketError = new SocketException();
                
                Console.WriteLine(ex.Message);
                Console.WriteLine(mySocketError.ErrorCode.ToString());
            }
        }
    }
    public delegate void MyCallback(string log);
}

und hier das Mainform:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace xxxxxx
{
    public partial class Form1 : Form
    {
        NetworkThread nwt;
        Thread thr1;
        string text;
        Control ctrl;

        public Form1()
        {
            InitializeComponent();

            nwt = new NetworkThread(514, new MyCallback(LogParse));
            thr1 = new Thread(nwt.Starte);
        }

        private void button_startLog_Click(object sender, EventArgs e)
        {
            button_startLog.Enabled = false;
            button_stopLog.Enabled = true;
            
            if (thr1.IsAlive == false)
                thr1.Start();
            else
                thr1.Resume();

            //Console.WriteLine("LOS GEHT ES");
        }

        private void button_stopLog_Click(object sender, EventArgs e)
        {
            button_startLog.Enabled = true;
            button_stopLog.Enabled = false;
            
            if (thr1.IsAlive == true)
                thr1.Suspend();
        }

        public void LogParse(string log)
        {
           //Console.WriteLine(log); 
           textBox1.AppendText(log);   
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //button_startLog.PerformClick();
            timer1.Start();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            Console.WriteLine(thr1.ThreadState.ToString());
        }

        
    }
}

Über hilfe wäre ich sehr dankbar!!!