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.
Annonceindlæg tema
Forsvar & beredskab
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
hvor der står vent tænkte jeg på nogle sekunder så den ikke bare køre derud af
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..
æhhmmm... Det hedder selvfølgelig Thread.Sleep(), og ikke Thread.Seep() ;)
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); } }
...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 }
så man kan ved hjælp af ThreadStart lave en tråd på en metode i samme klasse? hvis så er det skide smart!
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
Ja, det er sandt... og ja det er smart :D
ja... ups... det var min fæler... der skal selvfølgelig stå Thread t = new Thread(new ThreadStart(Metode));
prøver lige at finde ud af hvor den hænger i koden ved hjælp af debuggeren:)
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));
hvorfor egentlig det? bare så jeg ved det:)
Det ved jeg så ikke.. men fik du det til at virke?
jeg arbejder stadig på det.. vender tilbage om 2 sekunder med hvad jeg finder ud af
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
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?
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?
samler lige de relevante metoder og paster dem ind så
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:)
Metoder og properties skal skrives med stort forbogstav...
er du sikker på at din metode ikke bliver ved med at returnere false?
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
Starter du tråden i samme klasse som din Sleep() metode?
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å:)
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?
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:)
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...
01. juni 2006 - 22:42
#29
Det er blevet løst nu:) smid et svar for din tid:)
03. juni 2006 - 21:21
#30
her :)
08. juni 2006 - 12:44
#31
og her til dig:)
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.