Avatar billede burningice Nybegynder
29. oktober 2002 - 18:28 Der 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??
Avatar billede simon.ulsnes Nybegynder
29. oktober 2002 - 18:48 #1
Det er slet ikke så besværligt.

Denne kode indsættes når uret skal startes:
ThreadPool.QueueUserWorkItem(new WaitCallBack(UpdateClockLabel), ClockLabel);

Og dette indsættes et andet sted i dit vindues klasse:

public void UpdateClockLabel(object state)
{
  Label cl = (Label)state;
  cl.Text = DateTime.Now.ToString();
  Thread.Sleep(1000);
}

Denne metode bruger udelukkende threads, og faktisk ikke timere. Husk at inkludere System.Threading til dit projekt...

// Simon
// This sentence no verb.
Avatar billede simon.ulsnes Nybegynder
29. oktober 2002 - 18:51 #2
Hovsa, en svipser...

det skal se sådan ud:

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...

// Simon
Avatar billede burningice Nybegynder
29. oktober 2002 - 18:54 #3
weeh... :) kan jeg så også lave en tråd til min procedure der chekker db istedet for en timer??

er der nogle fordele ved tråde?? er det mindre resurce, memory, andet-krævende?
Avatar billede soreno Praktikant
29. oktober 2002 - 18:58 #4
jeg kender intet til .net men har lige et spørgsmål til simon,

i hvilke tilfælde vil Thread.CurrentThread.Abort(); blive eksekveret ?
for mig at se vil det aldrig ske ?
Avatar billede burningice Nybegynder
29. oktober 2002 - 19:03 #5
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 :)
Avatar billede simon.ulsnes Nybegynder
29. oktober 2002 - 20:07 #6
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.

// Simon
// This sentencen no verb.
Avatar billede simon.ulsnes Nybegynder
29. oktober 2002 - 20:09 #7
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.
Avatar billede burningice Nybegynder
29. oktober 2002 - 20:30 #8
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?
Avatar billede simon.ulsnes Nybegynder
29. oktober 2002 - 20:54 #9
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
Avatar billede burningice Nybegynder
29. oktober 2002 - 21:49 #10
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
Avatar billede simon.ulsnes Nybegynder
29. oktober 2002 - 21:57 #11
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
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
Kurser inden for grundlæggende programmering

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