Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: vb-ohjelman prossukäyttö

Sivun loppuun

sooda [12.05.2004 17:21:31]

#

teinpäs tässä testiksi ohjelman joka kattelee prossun käyttöä, toimii muuten hyvin mutta kun ohjelman käynnistää niin prossun käyttö hyppää 100%:aan, ohjelma ei valehtele, mulla on muitakin ja ne kertoo samoin :D saako vb-ohjelman jotenki niin ettei se kuluta niin rankasti prossua?

tuomas [12.05.2004 19:17:31]

#

Siis melkein joka ohjelmahan tekee sen että suorittimen käyttö nousee paljon ylöspäin käynnistyessään.
Kun ohjelma on päällä suoritin käyttö laskee yleensä yhtä nopeasti kuin se käynnistyessään nousi.
Tietenkin tuo määrä ainakin jonkin verran vähenee jos ohjelman (oletan että käytössä on nyt vb) load ja activate proseduureissa ei ole paljoa tavaraa.
Eikä käynnistyksen yhteydessä ladata kuvia musiikkia yms.

sooda [13.05.2004 08:39:09]

#

Mutta annoin sen olla päällä ainaski minuutin eikä se tehnyt muuta kun do-doevents-loopia jossa aina välillä sitten katsoo käytön, eikä lataa yhtikäs mitään. Olen huomannut että lähes kaikki mun vb-ohjelmat syö sikana prossua :P

peki [13.05.2004 09:08:11]

#

Ehkä sinun kannattaisi aloittaa tehokkaampi optimointi.
(Turha viesti, mutta oli pakko sanoa :P)

sooda [13.05.2004 10:09:53]

#

Njäh, c++:lla on hankalaa tehdä sitä mitä mä säädän(lcd-näytön kontrolleri systeemi, pitäis saada wintousikkunaan jota en händlaa c++:lla vielä hyvin). Ja kyllä ton varmaan jotenkin saa korjattua :P

tuomas [13.05.2004 14:45:07]

#

Sitten se liika prossun käyttö johtuu liian pitkästä loopista.

miiro [13.05.2004 14:56:59]

#

Muuten, miski SendKeys vie niin paljen prossutehoja?

nomic [14.05.2004 01:19:29]

#

loopin ei tarvitse edes olla pitkä että se vie tehoa kunhan sen antaa jatkua ja ottaa aina jotain muistiin niin se syö koska samaan aikaan se koittaa pyörittää standardi nopeuksilla looppia ja samaan aikaan kirjoittaa loopin sisällä tapahtunutta...
ja jos haluat että ohjelma ei vie alussa sitä 100% niin kokeile jotenkin että ohjelma lähtee "vähitellen" käyntiin... eihän autokaan lähde samantien niin että kierrokset on siinä 3500 ;)
eli siis anna avautuu ja lisää asioita yksikerrallaan toi on mun tapa millä oon estänyt moisia prossun-tehokäyttö-piikkejä :)

Blaze [14.05.2004 01:41:46]

#

Pitipäs oikeen testata.

Dim i As Integer
Do
    i = i + 1
    If i = 10000 Then i = 0
    DoEvents
Loop

100% prossukäyttö. Athlon XP 2400+ (~2GHz).

Looppi syö :P

Edit: Kooditagi haukkas 100:sta ykkösen ja nollan pois. Anto vähän väärän kuvan tapahtuneesta ^^;;

sooda [14.05.2004 12:33:34]

#

Eikö mitenkään saa tehtyä niin ettei pelkkä do-doevents-loop tyyppinen vie noin rankasti prossua? :S

miiro [14.05.2004 14:43:04]

#

Kävisikö timer? Muuten kynyn vielä uudestaan: miksi sendkeyskin vie niin paljon prossutehoa?
ja:

sooda kirjoitti:

teinpäs tässä testiksi ohjelman joka kattelee prossun käyttöä, toimii muuten hyvin mutta kun ohjelman käynnistää niin prossun käyttö hyppää 100%:aan, ohjelma ei valehtele, mulla on muitakin ja ne kertoo samoin :D saako vb-ohjelman jotenki niin ettei se kuluta niin rankasti prossua?

Miten sooda sen teit? Minäkin haluaisin tehdä sellaisen ohjelman...:)mutten tiedä miten...:(

Meitzi [14.05.2004 19:29:43]

#

Kerroppa vähän sooda mitä se ohjelma tekee ja mitä sen on tarkoitus tehdä. Tuskin siinä tarvitaan do-loop silmukkaa.

Antti Laaksonen [14.05.2004 19:45:18]

#

Itsekin olen pitemmän aikaa miettinyt, kuinka voisi tehdä VB:llä silmukan ilman, että prosessorin käyttö näyttää olevan 100 prosenttia. Timerin pienin aikaväli - vanhoilla Windowseilla 1/18 sekuntia - kun ei aina ole riittävä.

jcd3nton [15.05.2004 12:08:42]

#

Itsekin voi tehdä ´Timerin` käyttäen GetTickCountia ja silmukassa tarkistaa paljonko on aikaa kulunut, ja jos on tietty määrä niin koodi suoritetaan... Mutta silmukkahan se silti on, enkä tiedä kuinka paljon tämä kuluttaisi prosessori tehoa, kun ei ole ohjelmaa jolla tarkistaa...

Itselläni tuntuu lähes kaikki ohjelmat olevan täysin silmukassa pyöriviä, kun koodaan lähinnä DirectX appuja... (Kaikki tapahtuu silmukassa...)

Meitzi [15.05.2004 19:35:28]

#

Blaze kirjoitti:

Pitipäs oikeen testata.

Dim i As Integer
Do
    i = i + 1
    If i = 10000 Then i = 0
    DoEvents
Loop

100% prossukäyttö.

Miksi prosessorinkäyttö on 100%? Siksi että DoEvents suorittaa mahdolliset odottamassa olevat tehtävät, mutta jos sellasiia ei ole, niin silmukan suorittamistahan jatketaan normaalisti. Ja jos taas muuta tekemistä on, niin 100% se on jokatapauksessa.

Silmukka siis laskee I:n arvoa niin nopeasti kuin mahdollista mutta sallii kuitenkin muiden ohjelmien toimimisen samaan aikaan. Tottakai ohjelma käyttää kaiken mahdollinen prossutehon.

Tässä esimerkki joka odottaa aina 10 millisekuntia vapaana ja antaa näin prosessorille mukavasti vapaa-aikaa.

Private Declare Sub Sleep Lib "kernel32" (ByVal milliseconds As Long)

  Dim i As Integer
  Do
      i = i + 1
      If i = 10000 Then i = 0
      Sleep 10 'Odottaa 10 millisekuntia
  Loop

Riippuen ohjelmasta jopa 100 millisekuntia voi olla vielä ihan hyvä aika. (joka on siis 0.1 sekuntia)

jcd3nton [15.05.2004 19:57:49]

#

Mutta eikös tuo Sleep estä kuitenkin muun koodin suorittamisen päällä ollessaan... Itse en käytä Sleepiä ikinä koska ohjelmani toimivat täydellisesti loopissa =). Edelleen GetTickCount on monissa tilanteissa kätevä jota voi käyttää timerinä, mutta tarkempana sellaisena...

Antti Laaksonen [16.05.2004 01:24:34]

#

Minulla Meitzin koodinpätkä toimi varsin hyvin, kun siihen laittoi vielä DoEventsin mukaan. Silmukasta huolimatta prosessorin käyttö pysyi matalalla. Tuosta koodista on hyötyä!

setä [16.05.2004 09:12:22]

#

Vau, toimiiko tuo Sleep siis Timerin korvaajana. Timerihän yleensä hidastaa ohjelman suoritusta. Onkohan tämä nopeampi tapa. Täytyypi testailla.

setä [16.05.2004 10:26:34]

#

Antaa prossulle vapaa-aikaa mutta ei salli sen aikana tapahtumia ilman DoEvents-lausetta.
Jeps, Sleep tosiaan toimii kuin Timer. Siis ei aiheuta tietyn suuruista viivettä vaan silmukan kokonaisviiveeksi tulee tuo asetettu Sleep-aika yhdessä silmukan muiden viiveiden kanssa. Vastaa toiminnaltaan siis Timeriä eikä juurikaan nopeuseroja näy.

setä [16.05.2004 12:52:31]

#

Tossa Sleep-funktiossa on sama vika kuin Timerissäkin. Jos muutan viiveen 10.stä 11:een, kummallakin silmukan aika suurin piirtein tuplaantuu. Siis ei pysty säätään millisekunnin välein.

jcd3nton [16.05.2004 13:05:36]

#

GetTickCountilla saa vissiin äärimmäisen tarkan ajan otettua...

Meitzi [16.05.2004 13:50:01]

#

jcd3nton kirjoitti:

Mutta eikös tuo Sleep estä kuitenkin muun koodin suorittamisen päällä ollessaan... Itse en käytä Sleepiä ikinä koska ohjelmani toimivat täydellisesti loopissa =).

Ihan totta? Sleepin idea kun on juurikin lopettaa ohjelman toiminta hetkeksi totaallisesti jolloin saadaan oikeasti prosessori idletilaan.

setä kirjoitti:

Tossa Sleep-funktiossa on sama vika kuin Timerissäkin. Jos muutan viiveen 10.stä 11:een, kummallakin silmukan aika suurin piirtein tuplaantuu. Siis ei pysty säätään millisekunnin välein.

Tämä on ilmeisesti totta, ongelmaa voi yrittää kiertää niin että suorittaa sleep funktion vain joka kymmenes silmukka.

jcd3nton kirjoitti:

GetTickCountilla saa vissiin äärimmäisen tarkan ajan otettua...

Saa, mutta ei se auta tässä yhtään. Koska jos tee silmukjan joka tekee DoEventsiä tietyn ajan niin ei se anna edelleenkään prossessorille yhtään Idleaikaa.

Ja tosiaan, tuossa koodissa olisi pitänyt olla myös DoEvents mukana ettei ohjelma "jumitu".

setä [16.05.2004 14:09:06]

#

Tietääkö joku, mitä funktio QueryPerformanceCounter tarkkaan ottaen laskee (Tuo on Antti Laaksosen koodivinkissä). Kun testasin, miljoonaan laskeminen vei aikaa 0,28 sek. Entäs tämä GetTickCount, jota en vielä kokeillut.

Meitzi [16.05.2004 14:18:53]

#

Ja lisään vielä yhden kommentin ennekuin joku yrittää käyttää tuota sleeppiä johonkin todella väärään päikkaan.

Eli jos teet vaikka tietokonepeliä ja toteat, oho tämähän vie 100% prossutehoa, laskempa sitä hieman tolla kätevällä sleepillä, EI TODELLAKAAN NÄIN! Sleep hidastaa ohjelman toimintaa (sen idea on tehdä niin) ja siksi sitä ei missä tapauksesa voi käyttää esim peleissä jossa on aina tarkoitus käyttää kaikki koneesta löytyvät tehot.

jcd3nton [16.05.2004 15:03:16]

#

setä: Tässä esimerri GetTickCountista.

'Vaikkapa moduuliin tämä...
Public Declare Function GetTickCount Lib "kernel32" () As Long

'Funktio joka odottaa tietyn ajan ja palauttaa halutun tekstin
Private Function Ajasta(Aika As Long, Teksti As String) As String 'Aika millisekunteina
  Dim EdellinenAika As Long
  Dim UusiAika As Long
  Dim Silmukassa As Boolean

  EdellinenAika = GetTickCount
  Silmukassa = True

  Do While Silmukassa
  UusiAika = GetTickCount
    If UusiAika - EdellinenAika => Aika Then
      Debug.Print "Ajasta: Rajoitus oli " & Aika & " ms, aikaa kului " & UusiAika - EdellinenAika " ms."
      Silmukassa = Not Silmukassa
      Ajasta = Teksti
    End If
    DoEvents
  Loop
End Function

~jc

Meitzi [16.05.2004 15:40:06]

#

jcd3nton: tuossa tekstin ottamisessa parametrina ja saman tekstin palauttamisessa nyt ei kyllä ole mitään järkeä.

jcd3nton [16.05.2004 17:47:01]

#

Ei olekaan. Eikä tarvitsekaan =). Se on vaan yksi tyhmä esimerkki. GetTickCount:han on tuossa se pääasia. Kokeilitko tuota funktiota? Minkä ajan se palautti(jos kokeilit...)?

~jc

setä [16.05.2004 19:23:14]

#

Kiitos jcd3nton. Kokeilin 500 ms:lla ja aikaa kului 501 ms, QueryPerformanceCounter antoi lukemaksi 1775365 ja Timerfunktiolla ajaksi tuli 0,5 s. Ainakin Timerfunktion kanssa pelaa hyvin yksiin, tosin tuo Timer ei ole kovin tarkka, noin 20 ms:n resoluutio.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta