Avatar billede Anders_Jensen_14 Nybegynder
16. marts 2009 - 17:25 Der er 9 kommentarer og
1 løsning

Multi trådning ??

Hej

Jeg har siddet og leget med noget Trådning, men syntes ikke jeg kan få det til at virke.

Jeg har lavet en lille console app, som eks.

static readonly object lockme = new object();

//[ThreadStatic]
static int antal = 0;

static void Main(string[] args)
{
    List<string> items = new List<string>();
    items.Add("A");
    //items.Add("B");
    //items.Add("C");

    foreach (string item in items) {
        Thread thread = new Thread(Work);
        thread.Name = item;
        thread.Start();
    }

    Console.ReadLine();
}

static void Work() {
    Console.WriteLine(Thread.CurrentThread.Name + " køre nu...");
    Console.WriteLine(Thread.CurrentThread.Name + " har antal : " + GetAntal());

    Thread[] threads = new Thread[10];
    for (int x = 0; x < 10; ++x)
    {
        threads[x] = new Thread(MultiWork);
        threads[x].Name = Thread.CurrentThread.Name;
        threads[x].Start();
    }

    // Wait for them to complete
    foreach (Thread thread in threads)
    {
        thread.Join();
    }

    Console.WriteLine(Thread.CurrentThread.Name + " har antal : " + GetAntal());
    Console.WriteLine(Thread.CurrentThread.Name + " slutter nu...");
}

static void MultiWork() {
    SetAntal();
}

static int GetAntal() {
    lock (lockme)
    {
        return antal;
    }
}

static void SetAntal() {
    lock (lockme)
    {
        antal++;
    }
}

Hvis den her bliver kørt så er resultat :
A køre nu...
A har antal : 0
A har antal : 10
A Slutter nu...

Hvis jeg så tilføjer :
items.Add("B"); i toppen af Main.
Så er resultat:
A køre nu...
A har antal : 0
B køre nu...
B har antal : 0
B har antal : 19
B Slutter nu...
A har antal : 20
A Slutter nu...

Nogen som ved hvordan jeg holder A og B fra hinanden ? Så dataen ikke køre sammen ??
Avatar billede arne_v Ekspert
16. marts 2009 - 17:47 #1
1)  Der er alt for faa data til at du kan vurdere multithreaded korrekt.

2)  Hele ideen med multithreaded er at de koerer samtidigt.

3)  Du kan synkronsere med lock, men hvis du synkroniserer det hele, saa kunne du lige saa godt koere singlethreaded.
Avatar billede natas-dk Nybegynder
16. marts 2009 - 17:51 #2
måske du skulle lade være med at bruge den samme globale variabel til dit antal...
men lave en variabel i tråden, og så give den med til dine funktions kald...
Avatar billede Anders_Jensen_14 Nybegynder
16. marts 2009 - 17:56 #3
hej arne

Det er fordi det er nogle webrequest jeg køre af i de 10 tråde den laver. I mit rigtige program.

så vil jeg bare ha den til kunne køre 10 af gangen og tjekke.

Og så har jeg lavet så jeg kan tjekke flere sites på en gang.

Men det er måske den helt forkert fremgangs måde ???
Avatar billede arne_v Ekspert
16. marts 2009 - 18:26 #4
Nej - hvis du skal send mange HTTP requests saa er traade helt klart vejen frem !

Men det er bare svaert at kommentere saa det er relevant for den kode vi ikke har set.

:-)
Avatar billede Anders_Jensen_14 Nybegynder
16. marts 2009 - 19:24 #5
Er det muligt at sende data til main thread ?

    Thread[] threads = new Thread[10];
    for (int x = 0; x < 10; ++x)
    {
        threads[x] = new Thread(MultiWork);
        threads[x].Name = Thread.CurrentThread.Name;
        threads[x].Start();
    }

    // Wait for them to complete
    foreach (Thread thread in threads)
    {
        thread.Join();
    }

Nogen måde at jeg kan fange en return value ?
Avatar billede arne_v Ekspert
16. marts 2009 - 19:30 #6
Lav en klasse med data og work metode, lave en instans af den klasse per traad der skal koere, gem input data i objektet, start traad, lad traad gemme output data i objektet, vent paa traad er faerdig, hent output data fra objektet.
Avatar billede arne_v Ekspert
16. marts 2009 - 19:32 #7
Jeg lavede engang foelgende til et andet spoergsmaal:

using System;
using System.Diagnostics;
using System.IO;
using System.Threading;

namespace E
{
    public class MainClass
    {
        private const int NHOST = 256;
        public static void Main(string[] args)
        {
            Pinger[] p = new Pinger[NHOST];
            Thread[] t = new Thread[NHOST];
            for(int i = 0; i < NHOST; i++)
            {
                p[i] = new Pinger(i);
                t[i] = new Thread(new ThreadStart(p[i].Run));
                t[i].Start();
            }
            for(int i = 0; i < NHOST; i++)
            {
                t[i].Join();
                Console.WriteLine(p[i].Res);
            }
        }
    }
    public class Pinger
    {
        private int no;
        private string res;
        public Pinger(int no)
        {
            this.no = no;
            res = "";
        }
        public void Run()
        {
            ProcessStartInfo psi = new ProcessStartInfo();
            psi.FileName = "ping";
            psi.Arguments = "192.168.0." + no;
            psi.CreateNoWindow = true;
            psi.UseShellExecute = false;
            psi.RedirectStandardOutput = true;
            Process p = Process.Start(psi);
            StreamReader sr = p.StandardOutput;
            string line;
            while((line = sr.ReadLine()) != null)
            {
                res += line;
            }
            sr.Close();
            p.Close();
        }
        public string Res
        {
            get
            {
                return res;
            }
        }
    }
}
Avatar billede Anders_Jensen_14 Nybegynder
16. marts 2009 - 19:55 #8
Takker arne, prøver lige at lave et eks.. for at se om det virker... Vender tilbage.....
Avatar billede Anders_Jensen_14 Nybegynder
17. marts 2009 - 08:40 #9
Hej arne

super tak for hjælpen, dit lille stump kode hjalp mig.

Tilføj svar, så skal jeg lige gi dig dine points.
Avatar billede arne_v Ekspert
17. marts 2009 - 14:06 #10
svar
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