Avatar billede lemon Nybegynder
27. marts 2005 - 21:56 Der er 22 kommentarer og
1 løsning

Vent på thread

Jeg har en thread som håndtere en TCP forbindelse. Denne kører i baggrunden men i en enkelt funktion i mit program, skal jeg vente på en bestemt tilstand for denne thread, før end funktionen fortsætter. Hvordan gøres dette?
Funktionen må kort sagt ikke afslutte før min thread er klar til det.
Avatar billede arne_v Ekspert
27. marts 2005 - 22:09 #1
Måske kan du bruge klassen System.Threading.Mutex ?
Avatar billede lemon Nybegynder
27. marts 2005 - 22:15 #2
Ja jeg har kigget lidt på den, men synes ikke rigtigt jeg fatter hvordan man bruger den.
Avatar billede arne_v Ekspert
27. marts 2005 - 22:19 #3
Jeg bixer et eksempel.
Avatar billede arne_v Ekspert
27. marts 2005 - 22:25 #4
using System;
using System.Threading;

class MainClass
{
    public static Mutex mtx = new Mutex();
    public static void Main(string[] args)
    {
        Console.WriteLine("ready to start thread");
        (new Thread(new ThreadStart(Run))).Start();
        Thread.Sleep(1); // make sure thread gets mutex
        mtx.WaitOne();
        Console.WriteLine("all done");
        mtx.ReleaseMutex();
    }
    public static void Run()
    {
        Console.WriteLine("start thread");
        mtx.WaitOne();
        Thread.Sleep(5000);
        mtx.ReleaseMutex();
        Console.WriteLine("end thread");
    }
}
Avatar billede arne_v Ekspert
27. marts 2005 - 22:35 #5
Med Monitor:

using System;
using System.Threading;

class MainClass
{
    public static object o = new object();
    public static void Main(string[] args)
    {
        Console.WriteLine("ready to start thread");
        (new Thread(new ThreadStart(Run))).Start();
        Thread.Sleep(1); // make sure thread gets monitor
        Monitor.Enter(o);
        Console.WriteLine("all done");
        Monitor.Exit(o);
    }
    public static void Run()
    {
        Console.WriteLine("start thread");
        Monitor.Enter(o);
        Thread.Sleep(5000);
        Monitor.Exit(o);
        Console.WriteLine("end thread");
    }
}
Avatar billede lemon Nybegynder
27. marts 2005 - 22:47 #6
Tak :) Det var præcist hvad jeg søgte.

Smider du lige et svar.
Avatar billede arne_v Ekspert
27. marts 2005 - 22:49 #7
svar
Avatar billede arne_v Ekspert
27. marts 2005 - 22:49 #8
Jeg ved faktisk ikke hvad der er bedst Mutex eller Monitor
Avatar billede lemon Nybegynder
27. marts 2005 - 22:54 #9
Jeg bruger Mutex ind til jeg får brug for noget monitor kan. ;)
Avatar billede segato Nybegynder
29. marts 2005 - 10:46 #10
Jeg ville personligt ikke have valgt ovenstående metode. Jeg ville have brugt ManuelResetEvent eller AutoRestenEvent til dette formål. Peformance er en del bedre og Monitor er mere en critcal section end det er til styring af events.
Avatar billede lemon Nybegynder
29. marts 2005 - 10:59 #11
Kan du give et eksempel på hvordan xResetEvent bruges?
Avatar billede segato Nybegynder
29. marts 2005 - 11:32 #12
Det kan du tro det ret simpelt:

http://www.devx.com/dotnet/Article/7003/0/page/2

Man overføre et event til sin tråd som så kan sende signaler.
Avatar billede lemon Nybegynder
29. marts 2005 - 11:50 #13
Ja det ser faktisk let nok ud - jeg prøver lige at teste forskellen i aften.
Avatar billede segato Nybegynder
29. marts 2005 - 12:13 #14
Hvis du ikke kan få det op kan jge godt lave et mini eksempel. I bund og grund har du et array med events i. Det array overfører du til hver tråd vi konstructor. I den del der venter laver du så sådan en fætter her:

WaitHandle.WaitAny(....)

Den står så og venter på på dine tråde kalder Set på eventsene. Det meget mere kostumerbar måde at lave det på, da WaitAny returnere index på det event du har rejst i tråden. Uden at vide hvad du skal tror jeg mere det her er hvad du har brug for frem for Monitor klassen.
Avatar billede lemon Nybegynder
30. marts 2005 - 14:12 #15
segato : Jeg har en method som starter en thread, venter på at denne afslutter og så returnerer en status kode. Hele herligheden tager mellem 10 sekunder og helt op til nogle minutter, og bliver kun brugt et par gange i døgnet.

Hvis Mutex/Monitor ikke tager CPU kraft mens de venter, så kan det ikke have nogen indflydelse på performance - det er i øvrigt kun i forbindelse med debug at jeg bruger det, men da jeg stort set anvender threading i alt hvad jeg laver, vil jeg da meget gerne se et eksempel på ovenstående. ;o)
Avatar billede segato Nybegynder
30. marts 2005 - 16:02 #16
De andre metode er også helt fint ingen ting der. Men "min" metode er lidt mere fleksibel da man kan sende flere signaler. Jeg brøver lige at smide et lille eksempel til dig det meget nemt når man lige ser lyset. Jeg startede lige som dig men en anden gut fortalte mig den her metode som jeg så senere tog til sig. Smider et eksempel inden for 10 mins.
Avatar billede segato Nybegynder
30. marts 2005 - 16:15 #17
Ok har lavet et lille eksempel her. Det første er bare en knap i en windows app husk at inkludere namespace using System.Threading:

        private void button1_Click(object sender, System.EventArgs e)
        {
            AutoResetEvent[] events = new AutoResetEvent[2];
            events[0]    = new AutoResetEvent(false);    // Fail event.
            events[1]    = new AutoResetEvent(false);    // Succes even

            ThreadClass cls = new ThreadClass(events);
           
            Thread thread = new Thread(new ThreadStart(cls.Sleep));
            thread.Start();

            int index = WaitHandle.WaitAny(events);
        }

Tråd klassen er vist nedenunder:

using System;
using System.Threading;
namespace WindowsApplication2
{   
    public class ThreadClass
    {
        AutoResetEvent[] m_events = null;
        public ThreadClass(AutoResetEvent[] events)
        {
            m_events = events;
        }

        public void Sleep()
        {
            Thread.Sleep(3000);
            m_events[0].Set();
        }
    }
}

Hvis du debugger koden vil du se WaitHandle.WaitAny(events) gå i en vente tilstand indtil event.Set() bliver kaldt i din tråd. Og lig mærke til index som bliver returneret er det index på det event der bliver kaldt. Så man kan have en hel bunke events man kan fyre og gøre what ever med. Derudover finder der ManuelResetEvent som fungere på helt samme måde. Men når et event.Set() er kaldt skal man lige reset eventet for det aktiveres. Personligt syntes jeg det her giver mere fleksibel kode og jeg føler bdre jeg kan kontrolere hvad der sker. Men din egen måde er jo helt fin hvis det virker for lige den opgave du sidder med.
Avatar billede segato Nybegynder
30. marts 2005 - 16:17 #18
Lig derudover også mærke til Waithandler klassen har også en WaitAll hvis alle event i events[] skal signaleres før den går ud af sin waitstate.
Avatar billede lemon Nybegynder
30. marts 2005 - 16:22 #19
Det ser faktisk ud til at det godt kunne blive et nyttigt værktøj. Jeg bruger p.t. en state variabel, men denne kunne lige så vel blive parset gennem event, som gennem en property.
Lige det jeg er igang med nu, vil det nok bare være tidsspild at skifte koden ud, men jeg kan sagtens se det smarte i ovenstående da det er lettere at styre overvågning og skift mellem synkron og asynkron afvikling på den måde.
Avatar billede lemon Nybegynder
30. marts 2005 - 16:23 #20
Jeg tror i øvrigt jeg skifter min nuværende kode ud alligevel, da der skal bygges videre på det senere - og til den tid vil det være endnu mere tidsspild hvis jeg bliver nød til at skifte. ;o)
Avatar billede segato Nybegynder
30. marts 2005 - 16:29 #21
:D Helt enig når nu du er så tidligt i stadiet så gør det ordenligt med det samme. Held og lykke med det.
Avatar billede lemon Nybegynder
30. marts 2005 - 16:31 #22
Tak og tak for hjælpen :D
Avatar billede segato Nybegynder
30. marts 2005 - 16:34 #23
Det no problemmo:D
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