Avatar billede trenskow Nybegynder
23. marts 2009 - 10:46 Der er 11 kommentarer og
1 løsning

Threads og singleton

Hejsa

Jeg vil gerne høre jer, hvordan jeg laver dette stykke kode om, så jeg kan køre disse 3 threads i singleton, så der kun er en der kører af gangen.

void Test()
    {
        //Object thisLock = new Object();
        //    lock(this)

            if (a)
            {
                System.Threading.Thread t = new System.Threading.Thread(RunA);
                t.Start();
            }

            if (b)
            {
                System.Threading.Thread t = new System.Threading.Thread(RunB);
                t.Start();
            }
            if (c)
            {
                System.Threading.Thread t = new System.Threading.Thread(RunC);
                t.Start();
            }
Avatar billede Syska Mester
23. marts 2009 - 11:37 #1
ohhh ...

Jeg er ikke helt klar over hvad du vil ..

Men hvis du kun vil køre en af gangen, så efter du starter din tråd kan du indsætte følgende ... thrads og single har så vidt jeg ved intet med hinanden at gøre ...

indsæt:
t.Join();

Så venter den med at gå videre indtil tråden er færdig ...

Det du vil ?

// ouT
Avatar billede bitmatic Nybegynder
23. marts 2009 - 11:56 #2
Hvis du kun vil køre en ad gangen, hvorfor så lave det med flere tråde ?

Kan du ikke bare køre det i én tråd ???
Avatar billede trenskow Nybegynder
23. marts 2009 - 12:05 #3
Hej

Lidt mere forklaring

Den void Test() er en event som bliver triggered, og det kan være af typen a,b eller c.

Men der sker nogen gange det, at der kommer en ny event inden at den foregående er færdig med sin tråd. Jeg vil derfor gerne lave sådan, at der kun kan køre en af trådene af gangen, så de nye kommer i vente posisiton
Avatar billede aaberg Nybegynder
23. marts 2009 - 12:28 #4
Du bør nok selv oprette en kø av tråde, som bliver startet i rigtig rækkefølge. Se eventuelt på Queue klassn:
http://msdn.microsoft.com/en-us/library/system.collections.queue(VS.80).aspx
Der er også en Generic Queue:
http://msdn.microsoft.com/en-us/library/7977ey2c(VS.80).aspx
Avatar billede trenskow Nybegynder
23. marts 2009 - 12:55 #5
Hej

Tak for tippet.
Jeg har nu initialiseret en private Queue<System.Threading.Thread> ThreadQueue i starten, og tilføfet mine tråde dertil når de bliver kaldt.

Nu sidder jeg så og roder med en slags queueRunner, men det funger ikke helt

Jeg havde hurtigt bikset denne sammen, men kan se med det samme at det skaber problemer. Nogen fikse ideer?

private void QueueRunner()
        {
            while (ThreadQueue.Count == 0)
            {
                // wait
            }
            System.Threading.Thread t = ThreadQueue.Dequeue();
            t.Start();
            while (t.IsAlive)
            {
                // wait
            }
            QueueRunner();
        }
Avatar billede trenskow Nybegynder
23. marts 2009 - 12:59 #6
Er dette ikke meget bedre?

private void QueueRunner()
        {
            while (ThreadQueue.Count != 0)
            {
                System.Threading.Thread t = ThreadQueue.Dequeue();
                t.Start();
                while (t.IsAlive)
                {
                    // wait
                }

            }
        }
Avatar billede bitmatic Nybegynder
23. marts 2009 - 13:25 #7
Den traditionelle (og simple) måde at gøre det på ville være at lave en mutex som trådene kan tage når de starter og frigive når de er færdige.

Så slipper du for køerne og for at stå og vente på tråde der bliver færdige.
Avatar billede bitmatic Nybegynder
23. marts 2009 - 13:36 #8
Et lille eksempel:


class Program
{
  private static Mutex _mutex = new Mutex();

  static void Main(string[] args)
  {
    Thread tA = new Thread(new ThreadStart(RunA));
    Thread tB = new Thread(new ThreadStart(RunB));
    Thread tC = new Thread(new ThreadStart(RunC));

    tA.Start();
    tB.Start();
    tC.Start();

    Console.ReadLine();
  }


  private static void RunA()
  {
    _mutex.WaitOne();
    Console.WriteLine("RunA");
    _mutex.ReleaseMutex();
  }
  private static void RunB()
  {
    _mutex.WaitOne();
    Console.WriteLine("RunB");
    _mutex.ReleaseMutex();
  }
  private static void RunC()
  {
    _mutex.WaitOne();
    Console.WriteLine("RunC");
    _mutex.ReleaseMutex();
  }
}

Mutex garanterer ikke hvilken rækkefølge trådene bliver kørt i, men den garanterer at der kun er én af trådene der kører ad gangen. Håber det var det du ville....
Avatar billede trenskow Nybegynder
23. marts 2009 - 13:55 #9
Jep, det var lige det jeg ville.

Når jeg nu laver den mutex, så er jeg fri for at have en metode som jeg skrev lige før, som står og tjekker om der er noget der skal gøres?
Det sørger den kode du har skrevet der for? Så når man laver en ny tråd, så venter _mutex.WaitOne() på at en tråd slutter, hvis der kører en?
Avatar billede bitmatic Nybegynder
23. marts 2009 - 14:08 #10
WaitOne() prøver at "tage" mutex'en. Hvis den ikke kan få mutex'en, fordi en af de andre tråde har den, så venter den.

ReleaseMutex() frigiver mutex'en, så en af de andre tråde, der står og venter kan få den og køre videre.

Se mere på http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx
Avatar billede trenskow Nybegynder
23. marts 2009 - 14:16 #11
@bitmatic

Mange tak. Hvis du vil ligge et svar, så vil jeg tildele pointene.
Avatar billede bitmatic Nybegynder
23. marts 2009 - 14:40 #12
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