jeg har langt om længe fået lært mig selv noget om threads, men problemet er at når jeg kører en uendelig løkke i en thread, i et lille UDP Chat program jeg har sat sammen, sluger programmet omkring 50% af min CPU!
det virker... men det er ikke helt hvad jeg havde håbet på!
Spørgsmålet er om der er nogen der har en ide om hvordan man kan begrænse programmet således det ikke sluger alt min processor kraft... jeg har googlet efter det, samt kigget herinde på eksperten, men faktum er at jeg ikke ved hvad jeg leder efter.
Du bør redesigne. Det er kun en workaround at sænke prioritet.
Umiddelbart vil jeg tro at du skal have et loop som læser UDP datagrams blocking og enqueuer til en queue, hvor et antal threads blocking dequeer og processer.
som sagt lærer jeg efter krav men jeg er ret sikker på at de er pooled, og nej looped blocker ikke, jeg begyndte på det her i sidste uge... og har optil nu sagt at hvis det virker så er det det...
UDP datagrams, er store ord jeg er ikke så hardcore til det her endnu. jeg prøver lige ThreadPriority metoden!
ThreadPriority.Lowest virkede ikke, jeg har kun en enkelt tråd med en uendelig løkke. så selv om den er lowest priority anvender den stadig alle 50 procent.
Men hvordan kan man gøre, således løkken kun køre når der sendes eller der skal modtages... at sende er ikke noget problem, men jeg anvender løkken til at tjekke efter ny data!
public void lytEfterKliente() { lytteSocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp); try { IPEndPoint iep = new IPEndPoint(IPAddress.Any,_port); lytteSocket.Bind(iep); while(_running) { EndPoint ep = iep; byte[] data = new byte[1500]; int recv = lytteSocket.ReceiveFrom(data,ref ep);//<--- står og venter til data kommer byte[] tmp = new byte[recv]; for(int i =0;i<recv;i++) { tmp[i]=data[i]; } // nu har du dine data i tmp
} } catch(ThreadAbortException ex) { log.Debug("lytte tråd er aborted"+ex.Message); } catch(SocketException ex) { log.Error("Socket fejl i lytefterkliente",ex); } catch(Exception ex) { log.Error("Exception i "+ex); } finally { lytteSocket.Close(); } }
Det ser ikke helt dårligt ud lifo... jeg kan eventuelt anvende den som event til at starte min egen lyttetråd, men jeg får nogle fejl fra "lyttesocket" samt "_port" og "_running"...
jeg kunne ikke tilfældigvis lige få dig til at skrive hvad det er?
til md craig: Jeg har som sagt kun en enkelt thread, så tænkte jeg nok at den nok ikke ville virke blot at sætte priorities...
Og jeg ved faktisk ikke hvad "keyworded delegates" er så jeg kunne ikke forestille mig at jeg brugte dem.
til lifo: hele koden ville ikke være dårligt, det kunne være jeg fangede tricket i at undgå de uendelige løkker jeg anvender lige nu...
Jeg kiggede i den kode du skrev igår og fik det også til at virke, men den er næsten(alt er relativt) magen til min egen kode så spørgsmålet har nok ændret sig til "Hvordan du kører dine metoder, uden at anvende de uenelige løkker som sagt!"!
jeg er helt hundrede på at det er tråden jeg anvender til at lytte på netværket der bruger CPU kræfterne, da det ikke er første gang jeg anvender denne slags tråd...
og jeg kan godt anvende GUI'en fra min tråd da jeg har lavet den direkte i i min form klasse...
i tilfælde af tvivl ser koden således ud...
Thread dost = new Thread(new ThreadStart(dostuff)); dost.Start();
Det var så et grund skelet... Man kan også have parametre med i de forskellige metode og man kan kalde metoderne hvad man vil... og du kan desuden sagtens have flere delegates i en klasse...
hehe... der var lige lidt fejl... sådan kan det gå når man CopyPaster :P _____________________________________________________________________________________
public class WorkerClass { private volatile bool abort;
delegate void UDPListenerDelegate();
public void OnStart() { UDPListenerDelegate udpld = new UDPListenerDelegate(Working); udpld.BeginInvoke(new AsyncCallback(OnComplete), this); }
public void Working() { while(!abort) { //Do some work ...
//ThreadSleep 100 ms Thread.Sleep(100); } }
public void OnComplete(IAsyncResult iar) { //Cleanup kode her
AsyncResult ar = (AsyncResult) iar; UDPListenerDelegate rwd = (UDPListenerDelegate) ar.AsyncDelegate;
jess_chr skrev og jeg kan godt anvende GUI'en fra min tråd da jeg har lavet den direkte i i min form klasse...
det er lige meget hvor du laver din tråd bare du har flere tråde så kan det gå galt
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.