Avatar billede fastpoint Nybegynder
31. maj 2006 - 13:46 Der er 30 kommentarer og
1 løsning

oprette en tråd

Vi har en metode i vores system som returnere en bool.
Hvis metoden returnere true så skal koden køre videre og ellers skal den vente

Noget i stil med

while(!klasse.metode())
{
vent
}

men dette får programmet til at fryse så det skal laves i en tråd, men hvordan gør man det? har set på nogle eksempler som jeg ikke forstår.
Avatar billede fastpoint Nybegynder
31. maj 2006 - 13:51 #1
hvor der står vent tænkte jeg på nogle sekunder så den ikke bare køre derud af
Avatar billede globen Nybegynder
31. maj 2006 - 14:45 #2
Du kan definere din løkke i en metode. Men uden nogen parametre. Kald den f.eks.
Loop()
Så kan du starte en tråd på følgene måde:

Thread t = new Thread(new ThreadStart(Loop));
t.Start();

I løkken kan du så tjekke din metode, og hvis den returner false, kan du sætte din tråd i bero ved at skrive

Thread.Seep(ms)

Hvor ms indikerer hvor lang tid din tråd skal sove, i millisekunder, og så prøve igen..
Avatar billede globen Nybegynder
31. maj 2006 - 14:47 #3
æhhmmm...

Det hedder selvfølgelig Thread.Sleep(), og ikke Thread.Seep() ;)
Avatar billede globen Nybegynder
31. maj 2006 - 15:27 #4
Du skal også huske at bruge namespacet System.Threading

...og her er et lille eksempel:

public void StartTraad()
{
  Thread t = new Thread(ThreadStart(Loop));
  t.Start();
}

public void Loop()
{
  while (true)
  {
    if (DinMetode())
    {
      //Udfør kode
    }
    else
      Thread.Sleep(2000);
  }
}
Avatar billede globen Nybegynder
31. maj 2006 - 15:40 #5
...eller hvis det ikke er gentagelser, kan du gøre således:

public void StartTraad()
{
  Thread t = new Thread(ThreadStart(Metode));
  t.Start();
}

public void Metode()
{
  //Kode udføres
           
  bool loop = true;
  while (loop)
  {
    if (DinMetode())
      loop = false;
   
    else
      Thread.Sleep(2000);

  }

  //Kodeudførsel fortsætter
}
Avatar billede fastpoint Nybegynder
31. maj 2006 - 15:50 #6
så man kan ved hjælp af ThreadStart lave en tråd på en metode i samme klasse?
hvis så er det skide smart!
Avatar billede fastpoint Nybegynder
31. maj 2006 - 16:02 #7
der skal vel også stå new ThreadStart ?
men det virker desværre ikke.. den crasher bare.

prøver selvfølgelig at tilpasse det min kode
Avatar billede globen Nybegynder
31. maj 2006 - 16:03 #8
Ja, det er sandt... og ja det er smart :D
Avatar billede globen Nybegynder
31. maj 2006 - 16:05 #9
ja... ups... det var min fæler...
der skal selvfølgelig stå
Thread t = new Thread(new ThreadStart(Metode));
Avatar billede fastpoint Nybegynder
31. maj 2006 - 16:06 #10
prøver lige at finde ud af hvor den hænger i koden ved hjælp af debuggeren:)
Avatar billede globen Nybegynder
31. maj 2006 - 16:07 #11
og husk at i det statement skal du ikke skrive () på den metode, som ThreadStart() bruger

Altså du må ikke skrive
Thread t = new Thread(new ThreadStart(Metode()));
men
Thread t = new Thread(new ThreadStart(Metode));
Avatar billede fastpoint Nybegynder
31. maj 2006 - 16:43 #12
hvorfor egentlig det? bare så jeg ved det:)
Avatar billede globen Nybegynder
31. maj 2006 - 16:45 #13
Det ved jeg så ikke.. men fik du det til at virke?
Avatar billede fastpoint Nybegynder
31. maj 2006 - 16:55 #14
jeg arbejder stadig på det.. vender tilbage om 2 sekunder med hvad jeg finder ud af
Avatar billede fastpoint Nybegynder
31. maj 2006 - 17:22 #15
okay ved hjælp af debuggeren kom jeg frem til, at den nærmest fryser i løkken..
så den har vel ikke rigtig fungeret som en tråd?
den skal gerne køre parallelt med GUI'en som starter tråden
Avatar billede globen Nybegynder
31. maj 2006 - 17:28 #16
Har du husket at sætte tråden i gang med dens Start() metode...

Hvis ikke, har du mulighed for, at copy-paste noget af dit kode fra der det går galt?
Avatar billede fastpoint Nybegynder
31. maj 2006 - 17:36 #17
det kan jeg godt, men først.. så starter jeg tråden i min konstruktør på mit objekt.. det kan man måske ikke?
Avatar billede globen Nybegynder
31. maj 2006 - 17:37 #18
jo det kan man sagtens
Avatar billede fastpoint Nybegynder
31. maj 2006 - 17:40 #19
samler lige de relevante metoder og paster dem ind så
Avatar billede fastpoint Nybegynder
31. maj 2006 - 17:43 #20
jeg har 2 gui'er og i begge konstruktørere er der dette kode

            Thread start = new Thread(new ThreadStart(sleep));
            start.Start();

og i klassen denne metode

        public void sleep()
        {
            while (!facade.myTurn(player.player))
            {
                Thread.Sleep(2000);
            }
            label6.Text = "Din tur";
        }



i den klasse som begge gui'er har kendskab til kaldes denne metode

        public bool myTurn(string name)
        {

            if (name == toPlay.player)
                return true;
            else return false;
        }

og den holder bare styr på hvem det er der har tur. toPlay indeholder altså værdi'en.

men den fryser fordi den looper der konstant.. den skal loope ja men ikke fryse:)
Avatar billede globen Nybegynder
31. maj 2006 - 18:01 #21
Metoder og properties skal skrives med stort forbogstav...
Avatar billede globen Nybegynder
31. maj 2006 - 18:02 #22
er du sikker på at din metode ikke bliver ved med at returnere false?
Avatar billede fastpoint Nybegynder
31. maj 2006 - 18:08 #23
det gør den.. men det er også derfor jeg vil have at den ikke skal fryse..

hvis den ikke fryser kan jeg nemlig gøre så den returnere true..

men når det hele fryser kan jeg ikke lave et træk og så vil det hele fryse
Avatar billede globen Nybegynder
31. maj 2006 - 18:19 #24
Starter du tråden i samme klasse som din Sleep() metode?
Avatar billede fastpoint Nybegynder
31. maj 2006 - 18:22 #25
yeps, men sleep() kalder som sagt på en metode i en anden klasse..

jeg forstår ikke rigtig hvorfor den gør det..

hvis du laver en gui som skal tjekke om en metode i en anden klasse returnere true eller false uden at fryse hvordan ville du så gøre det?
det er i hvertfald det som jeg prøver på:)
Avatar billede globen Nybegynder
31. maj 2006 - 18:27 #26
Jeg kan ikke umiddelbart se, at der skulle være noget galt med din Sleep() metode, men når du skriver player.player, referer du så til en public attribut?
Avatar billede fastpoint Nybegynder
31. maj 2006 - 18:31 #27
de er private.. og henter dem med

        public string player
        {
            get { return playerID; }
            set { playerID = value;}

men har som sagt 2 gui'er. den ene opretter den anden og det er når den anden kommer frem at den går i ring ved den løkke jeg nævnte før.

det er nemlig meningen at den først skal blive true i løkken når den første gui har lavet et træk.

men det er svært når det fryser pga. løkken:)
Avatar billede globen Nybegynder
31. maj 2006 - 19:31 #28
Jeg har lige lavet en lille test-application, der kører med en tråd... har du en mail adresse, så sender jeg det lige til dig...
Avatar billede fastpoint Nybegynder
01. juni 2006 - 22:42 #29
Det er blevet løst nu:) smid et svar for din tid:)
Avatar billede globen Nybegynder
03. juni 2006 - 21:21 #30
her :)
Avatar billede fastpoint Nybegynder
08. juni 2006 - 12:44 #31
og her til dig:)
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