29. oktober 2002 - 18:28Der er
10 kommentarer og 1 løsning
To timere
Hejsa
Jeg har lavet et lille program, som hvert andet sekund checker en db og udfører noget... det virker fint nok, hurray... :) Nu vil jeg også have en ur på formen, der hele tiden skal køre med sekunder, så jeg har lavet en ny timer der hvert sekund opdaterer den label der viser klokken... det virker også fint, hurray :)
meen.. der er et problem... den procedure der checker db'en og det, er mere end et sekund om at udføres, dvs at der kommer hakker i klokken, da den ikke opdaterer mens db'en bliver checket ??
Hvordan løser jeg det?? Det første jeg kom i tanke om var tråde, men kan det virkelig passe at det skal være så besværligt?? Eller er tråde måske slet ikke så svært??
public void UpdateClockLabel(object state) { Label cl = (Label)state; while (true) { cl.Text = DateTime.Now.ToString(); Thread.Sleep(1000); } Thread.CurrentThread.Abort(); }
I stedet for true kan du indsætte en bool-variabel som skal afgøre om uret skal opdateres videre. Dette er smart at implementere for at være sikker på at tråden afsluttes sammen med programmet...
soreno>> han skrev jo at man kunne bruge en bool værdi istedet for true... så kan man jo sætte bool-værdien til false, og så bliver Abort() kommandoen udført... så meget kender jeg da til det, selvom jeg også er rimelig novice :)
cyberfessor >> Fordelen ved separate tråde (multi-threading) er, at hver procedure får sit eget "rum" af processoren, og det er derfor muligt at udføre flere opgaver på samme tid, uafhængigt af hinanden.
For eksempel har jeg skrevet en klasse der kan erstatte TcpListener, som ikke er multi-threaded og derfor standser programmet helt når den startes, som bygger på threads og events. En thread startes som lytter efter beskeder på en given port. Når en besked modtages, startes en ny thread som så behandler beskeden og affyrer eventuelle events. Denne metode er smart, da klassen kan håndtere mange forbindelser på samme tid uden at de påvirker hinanden...
Du kan sagtens også lave en tråd til din database. Jeg ved det ikke præcist, men jeg ville gå ud fra at du opnår bedre ydelse da processoren udnyttes mere.
NB! Husk altid at inkludere et Thread.Sleep(...)-kald i din while(...)-løkke, medmindre du har en anden funktion som blokker tråden, ellers laver processoren ikke andet end at gentage løkken og alle systemressourcer vil hermed være optagede konstant.
simon.ulsnes>> det er klart, det med Sleep'en, men f.eks. i din tråd hvor den lytter på på en port... kører den hele tiden, eller er der også en Sleep på den?
Den kører hele tiden, men bliver blokket af TcpListener.AcceptSocket() som venter indtil nogen prøver at komme i kontakt med computeren på porten... Jeg kan sende dig kildekoden, hvis du er interesseret, bare smid en mailadresse...
simon.uslness>> det ville da være meget dejligt... jeg har kun arbejdet med asp på proffesionelt niveau og vb6t på hobbyniveau, så asp.net og .net i det hele taget er helt nyt for mig... er det kodet i c# eller vb.net?
Min mailadresse er pauli@[fjerndette]burningice.dk
Det er i C#, det synes jeg meget bedre om end VB, men det er jo en religionssag... :-)
Hvis du overvejer at begynde på C# kan du jo også her se hvordan nogle ting gøres. Desuden kan du jo sagtens bruge biblioteket i VB.NET-programmer selvom det er skrevet i C#... Det kompileres til en DLL-fil.
// Simon
Synes godt om
Ny brugerNybegynder
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.