Multi thread app

di il
1 risposte

Multi thread app

Salve a tutti , scusate il disturbo , vorrei creare un appalicazione per il seguente scenario , ho uno stream inviato da un altra applicazione , (delle stringe), su tcpip , vorrei catturarle e inviarle in una listvew di una gui e vorrei poter fare altre operazioni mentre lo stream tcp ip aggiorna i dati nel listview , ho pensato di usare i threads , (forse il concurrent ?) , ho buttato giu gia qualcosa , ma non riesco a capire come faccio a passare i dati dal thread dove risiede la parte server tcpip (in loop while ) --> al listview , qualcuno potrebbe darmi un indicazione , grazie
allego il mio codice giusto per capire grazie a tutti
using System;
using System.Threading;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;


namespace TerminalTest
{



    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button3_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(t =>
            {
            TcpListener server = null;
          //  try
         //   {
                // Set the TcpListener on port 13000.
                Int32 port = 23456;
                IPAddress localAddr = IPAddress.Parse("127.0.0.1");

                // TcpListener server = new TcpListener(port);
                server = new TcpListener(localAddr, port);

                // Start listening for client requests.
                server.Start();

                // Buffer for reading data
                Byte[] bytes = new Byte[256];
                String data = null;

                    // Enter the listening loop.
                    while (true)
                    {
                        Console.Write("Waiting for a connection... ");

                        // Perform a blocking call to accept requests.
                        // You could also use server.AcceptSocket() here.
                        TcpClient client = server.AcceptTcpClient();
                        Console.WriteLine("Connected!");

                        data = null;

                        // Get a stream object for reading and writing
                        NetworkStream stream = client.GetStream();

                        int i;

                        // Loop to receive all the data sent by the client.
                        while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                        {
                            // Translate data bytes to a ASCII string.
                            data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                            Console.WriteLine("Received: {0}", data);
                            MessageBox.Show(data);
                        // Process the data sent by the client.
                        data = data.ToUpper();

                            byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);

                            // Send back a response.
                            stream.Write(msg, 0, msg.Length);
                            Console.WriteLine("Sent: {0}", data);
                        }

                        // Shutdown and end connection
                        client.Close();
                    }
              //  }
               

            })
            { IsBackground = true };
            thread.Start();
        }

        private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
    }
}

1 Risposte

  • Re: Multi thread app

    Potresti condividere una lista (una coda) di stringhe fra il thread e la form contenente il datagrid.
    Il thread alimenta la lista mentre la form, con un timer, scarica periodicamente le nuove stringhe (eliminandole dalla lista).
    Ti consiglio infine di utilizzare un "semaforo" nell'accesso alla coda, per evitare accessi contemporanei; in C# ti basta proteggere le parti che accedono alla coda con lock(){}; vedi esempio https://ilprogrammatorepigro.tumblr.com/post/138188341442/c-i-lock
Devi accedere o registrarti per scrivere nel forum
1 risposte