Avatar billede soreno Praktikant
12. juli 2004 - 19:43 Der er 12 kommentarer og
1 løsning

Parameter til tråd metode

Følgende C# kode (som testes under Framework 2.0 beta):

  class Program
    {
        private static byte[] buffer = { 0x61, 0x62 };

        public static void ClientHandler ( Socket client )
        {
            client.Send(buffer);
            client.Disconnect(false);
        }

        public static void Main ( string[] args )
        {                       
            IPAddress hostIP = (Dns.Resolve(IPAddress.Any.ToString())).AddressList[0];
            IPEndPoint endPoint = new IPEndPoint(hostIP, 12345);
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            server.Bind(endPoint);
            server.Listen(5);
           
            while ( true )
            {
                Socket client = server.Accept();
                Thread t = new Thread(new ThreadStart(ClientHandler(client)));  <=================           
            }
        }
    }

Skulle gerne starte en tråd, hvor "ClientHandler" metoden taget et parameter. Det kan jeg ikke få tråd klasserne til at acceptere - hvordan gør man ?
Avatar billede arne_v Ekspert
12. juli 2004 - 19:47 #1
Mnagler der ikke en new ?
Avatar billede arne_v Ekspert
12. juli 2004 - 19:49 #2
Vrøvl.

Eller næsten vrøvl.
Avatar billede arne_v Ekspert
12. juli 2004 - 19:49 #3
Lav et objekt af en klasse med new, send argumentet med til constructor
og kald threadstart med en metod epå det objekt.
Avatar billede arne_v Ekspert
12. juli 2004 - 19:50 #4
Her er et meget Java like eksempel:

using System;
using System.Threading;

public class T
{
    private static Random rng = new Random();
    private int n;
    public T()
    {
        n = 0;
    }
    public void Run()
    {
        while(true)
        {
            Thread.Sleep(rng.Next(100));
            n++;
        }
    }
    public int N
    {
        get {
            return n;
        }
    }
}

class MainClass
{
    public static void Main(string[] args)
    {
        T[] t = new T[4];
        for(int i = 0; i < t.Length; i++)
        {
            t[i] = new T();
           
        }
        for(int i = 0; i < t.Length; i++)
        {
            (new Thread(new ThreadStart(t[i].Run))).Start();
        }
        while(true)
        {
            for(int i = 0; i < t.Length; i++)
            {
                Console.Write(" " + t[i].N);
            }
            Console.WriteLine();
            Thread.Sleep(1000);
        }
    }
}
Avatar billede soreno Praktikant
12. juli 2004 - 19:51 #5
Hvor ?

I dokumentationen finde dette eksempel (hvor kommentarer og lidt kode under t.Start er fjernet):

public class ThreadExample {
    public static void ThreadProc() {
        for (int i = 0; i < 10; i++) {
            Console.WriteLine("ThreadProc: {0}", i);
            // Yield the rest of the time slice.
            Thread.Sleep(0);
        }
    }

    public static void Main() {
        Thread t = new Thread(new ThreadStart(ThreadProc));
        t.Start();
    }
}

Det er det samme jeg vil, jeg vil bare gerne have et parameter med til metoden.
Avatar billede soreno Praktikant
12. juli 2004 - 19:53 #6
Det var selvfølgelig en work-around med parameter til konstruktør.
Men mon ikke det kan lade sig gøre på den anden måde ?
Avatar billede arne_v Ekspert
12. juli 2004 - 19:53 #7
Gør det Java style.

Argument med over i constructor, constructor gemmer i instans variabel,
start tråd med Run metode uden argument, Run bruger instans variablen.
Avatar billede arne_v Ekspert
12. juli 2004 - 19:59 #8
Jeg tvivler lidt på at det kan lade sig gøre.

Hvilken kode skulle der genereres ?

Med den kedelige måde kalder du en constructor med en pointer til en metode.

Det er lidt avanceret fordi det ikke behøver være en statisk metode d.v.s.
at der reelt kommer både adressen på et objekt og adressen på en funktion med
over.

Men et ukendt antal argumenter ville nok være at svært at implementere.

Jeg vil ihvertfald være meget imponeret hvis det kan lade sig gøre.
Avatar billede soreno Praktikant
12. juli 2004 - 20:02 #9
I første omgang blev det:
    class ClientHandler
    {
        private byte[] buffer = { 0x69, 0x65 };
        private Socket client;

        public ClientHandler ( Socket client )
        {
            this.client = client;
        }

        public void Run ( )
        {
            Console.WriteLine("Client: {0:}", client.RemoteEndPoint.ToString());
            client.Send(buffer);
            client.Disconnect(false);
        }
    }

    class Program
    {       
        public static void Main ( string[] args )
        {                       
            IPAddress hostIP = (Dns.Resolve(IPAddress.Any.ToString())).AddressList[0];
            IPEndPoint endPoint = new IPEndPoint(hostIP, 12345);
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            server.Bind(endPoint);
            server.Listen(5);
           
            while ( true )
            {
                Socket client = server.Accept();
                ClientHandler ch = new ClientHandler(client);
                Thread t = new Thread(new ThreadStart(ch.Run));
                t.Start();
            }
        }
    }

Men kunne det have noget med delegates at gøre (det er et område jeg endnu ikke har kigget på) ?
Avatar billede soreno Praktikant
12. juli 2004 - 20:07 #10
Under alle omstændigheder så vil jeg ikke benytte en statisk metode til tråden.

Men det kunne nu stadig være sjovt at få det til at virke med et parameter til trådmetoden.

Det vil jeg kigge på i morgen.
Avatar billede arne_v Ekspert
12. juli 2004 - 20:08 #11
Fra 1.1 docs:

public delegate void ThreadStart();
Avatar billede soreno Praktikant
17. juli 2004 - 11:37 #12
Nå, det fik jeg ikke kigget på alligevel.

Svar => Point
Avatar billede arne_v Ekspert
17. juli 2004 - 11:40 #13
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester