Toon posts:

[VB.net] 100% CPU gebruik door middel van zelfgemaakt prog *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben net begonnen met een programma te schrijven in VB.net .
Nu is het de bedoeling dat dmv op een specifieke knop te klikken een soort looplicht geactiveerd wordt die zich steeds herhaald.
Dit is m'n code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click


        Timer1.Start()
        pControl.setPin(0, True)
        Threading.Thread.Sleep(1000)
        pControl.setPin(0, False)
        pControl.setPin(1, True)
        Threading.Thread.Sleep(1000)
        pControl.setPin(1, False)
        pControl.setPin(2, True)
        Threading.Thread.Sleep(1000)
        pControl.setPin(2, False)
        pControl.setPin(3, True)
        Threading.Thread.Sleep(1000)
        pControl.setPin(3, False)
        pControl.setPin(4, True)
        Threading.Thread.Sleep(1000)
        pControl.setPin(4, False)
        pControl.setPin(5, True)
        Threading.Thread.Sleep(1000)
        pControl.setPin(5, False)
        pControl.setPin(6, True)
        Threading.Thread.Sleep(1000)
        pControl.setPin(6, False)
        pControl.setPin(7, True)
        Threading.Thread.Sleep(1000)
        pControl.setPin(7, False)
        Threading.Thread.Sleep(1000)

    End Sub

Nu heb ik 1 probleem:
M'n CPU wordt 100% belast als ik het programma run, dit is toch niet omdat ik de parallelle poort aanstuur |:( .

Hoe kan ik dit probleem oplossen? Op GoT vind ik wel iets maar dit is dan voor C++, daar ben ik ook niet veel mee |:( . Google levert ook al niets op :'(

edit: typo's

[ Voor 19% gewijzigd door Verwijderd op 07-12-2004 20:36 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:44

Creepy

Tactical Espionage Splatterer

Loop eens stap voor stap door je code heen en kijkt eens wat er wordt uitgevoerd. Zie ook: P&W FAQ - Leer **** debuggen!!

Het stuk code zoals je nu post zou geen 100% CPU moeten gebruiken. Wat doe je eigenlijk in de timer? En waarom heb je er twee (t en timer1)?

Tip: kijk eens naar het gebruik van de code tags hier op het forum. Dat maakt je code stukken leesbaarder :)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
ok, zal ik ff editen, alvast bedankt voor de hulp :)
dom van me om 2 timers te gebruiken, alweer iets bijgeleerd :p


EDIT: probleem opgelost, er was dus een conflict tussen de 2 timers, allemaal door zo'n domme fout van mij...

nog een vraagje: hoe kan ik iets random laten kiezen; dus tussen data out 0-7 iets laten kiezen, tem die alle 8 aan de beurt geweest zijn, dan reset hij, en begint hij opnieuw(uiteraard met een andere keuze)

thnx again _/-\o_

[ Voor 108% gewijzigd door Verwijderd op 06-12-2004 21:37 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Zet even je code tussen [ code ] [ / code ] tags.

Iets randoms laten kiezen doe je door gebruik te maken van de Random class. Dat kan je allemaal in de MSDN vinden.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
ja, dat heb ik al gezien, maar dan zit ik nogaltijd met

code:
1
pControl.setpin(pinnr, true/false)


hoe regel ik dat dan

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
ik snap niet echt wat je probleem nou is?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
als ik een random number heb, moet dit gekozen worden als pin,

dus moet er een pin gekozen worden(random) van de 8 out pins van de parallelle poort en dan moet die hoog gemaakt worden.

Verwijderd

1) Wat doet de timer? Je maakt hem aan maar je gebruikt hem verder niet...?

2) Je code kan wel iets leesbaarder geschreven worden... iets als

Visual Basic:
1
2
3
4
5
For pin = 0 To 8 
  pControl.setPin(pin, True)
  Threading.Thread.Sleep(1000)
  pControl.setPin(pin, False)
Next


(Tip: Als je bijna dezelfde code twee keer of vaker terug ziet komen loont het vaak de moeite er een lus of functie van te maken)

3) Normaal gesproken verbruik je 100% CPU tijd als je programma in een oneindige lus zit (hier niet aan de orde lijkt me), of aan busy waiting doet. Busy waiting ziet eruit als:

Visual Basic:
1
2
3
While Not Gewenste_Staat_Bereikt
  ' Doe niets
Wend


En het resultaat hiervan is dat je CPU als een dolle de wachtconditie de hele tijd gaat evalueren (dat gaat heel efficiënt), en verder aan niets toekomt.

Een paar (mogelijk) oplossingen:

• Het kan zijn dat je Sleep() functie niet helemaal fris is, en aan busy waiting doet. In dat geval zul je die moeten ditchen en een andere gebruiken.

• Het lijkt erop of je threads gebruikt. Is het toevallig zo dat deze code in een thread zit en de main thread aan het busy waiten is tot de thread afgelopen is? In dat geval zit dáár je 100% CPU verbruik.

• If all else fails, schroef gewoon de prioriteit van je proces of thread naar beneden. In dat geval verbruik je nog steeds 100% CPU, maar als andere processen iets te doen hebben krijgen die voorrang; oftewel, de werking van je computer wordt er verder niet door beïnvloed.

[ Voor 4% gewijzigd door Verwijderd op 07-12-2004 00:03 ]


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-05 09:50

pjvandesande

GC.Collect(head);

100% CPU komt omdat je je MainThread laat slapen. Dus gewoon even in een nieuwe Thread zetten dat spul.

Voor de Random klik hier.

[ Voor 78% gewijzigd door pjvandesande op 07-12-2004 08:44 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op maandag 06 december 2004 @ 22:42:
als ik een random number heb, moet dit gekozen worden als pin,

dus moet er een pin gekozen worden(random) van de 8 out pins van de parallelle poort en dan moet die hoog gemaakt worden.
Ja dus ik snap niet wat het probleem is
C#:
1
2
int pinnr = randomNummer;
pControl.setpin(pinnr, true);


Die code heb jij toch ook al. Wat is dan het probleem om je random pin een waarde te geven.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 10-05 16:41

Nick_S

++?????++ Out of Cheese Error

Volgens mij bedoelt de TS dat elke pin wel evenvaak aan de beurt moet komen, maar wel random.

Ik kan even geen VB.net, maar het principe blijft hetzelfde
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Maak boolean array van 0 tot 7;
for int i = 0 tot 7 {
  array[i] = false;
}
int random is random0tot7
while (not array[random]) {
  random is random0tot7;
}
setPin (random, true);
sleep
setPin (random, false);
array[random] = true;

dit 8 keer achter elkaar, daarna overnieuw beginnen.


Puur pseudocode, maar hoop dat het principe duidelijk is.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'

Pagina: 1