Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

CPU Auslastung zu hoch

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 06.04.2013, 23:40    Titel: CPU Auslastung zu hoch Antworten mit Zitat

wie meine Überschrift schon sagt hab ich das Problem das bei meinem Prog die CPU in die höhe schnellt und mein laptop anfängt zu glühen. Auf der Suche nach dem Problem dachte ich mir vllt. könnte es an einem zu langem Screenlock liegen?!

Habe darauf in eine Logdatei TIMER schreiben lassen - vor dem ScreenLock und nach dem ScreenUnLock

lock 9967.703196757177
Un-lock 9967.711507838234

bei diesem Ergebniss denke ich aber nicht das es zu lang ist, oder?

Selbstverständlich benutze ich auch Sleep
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 07.04.2013, 00:00    Titel: Antworten mit Zitat

Ohne Code kann man leider nur raten. Kannst du ein Beispiel erstellen, bei dem das Verhalten auftritt und es hier oder bei längerem Code im Paste-System des Portals pasten?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 07.04.2013, 00:22    Titel: Antworten mit Zitat

ich versuchs mal mit nem auszug
dazu muss ich sagen das ich TSNEPlay mit benutze, da ich in dessen Subs nichts ausser Mutex und das speichern der Empfangen Daten drin hab lass ich es mal weg.

ShowOb(..., ...) fragt kurz gesagt ein Array nach angelegten Objekten ab und zeichnet sie
SetMouseFrame(5, &h000000) Ein Obj. lässt sich mit bis zu 9 weiteren verknüpfen - hier soll jetzt das 4. angehängte bei Mausberührung schwarz umrandet werden.
Objekt_APP gibt sowas wie eine ID eines angelegten Objektes zurück

Die dazugehörigen Subs hab ich jetzt hier nicht mit anbei da ich Sie in einer .bi hab stell sie aber gern noch bereit - kann aber schon sagen das in diesen selbst kein Screenlock zu finden ist.
EDIT: hab mal doch noch die Objektorganisationsdatei hochgeladen
objekte.bi

Gleich oben an ist der Teil bei dem ich den Verdacht hatte
Code:
DO
  sleep 5
  logd("lock " & Timer, "PM-Log") 'in Logdatei schreiben
  ScreenLock
  ClearScr                'CLS + ShowOb(100, 0)
  ShowOb(1, 99)       '
  IF HauptMenu = 1 THEN
    Line ((w/2)-64, (h/2)-16) - STEP(128, 32),&hAAAAAA ,BF
  END IF
 
  ShowOb(101, 106)
  SetMouseFrame(5, &h000000)
  ScreenUnLock
  logd("Un-lock " & Timer, "PM-Log")

  Oapp = Objekt_APP
  Select Case Oapp
  Case 1 TO 99
    ' ********** Nachrichten **********
    IF click_on_series(Oapp, 5) THEN
      SetText(SendeMail, 2, format (now,"hh:mm") & " " & format (now,"dd-mm-yyyy"))
      SetText(SendeMail, 3, "")
      SetText(SendeMail, 5, GetText(Oapp, 5))
      Unhide_Obj(SendeMail)

      newmailSub
      Kill_Obj(Oapp)
    ELSE
      Kill_Obj(Oapp)
      ClearScr
    END IF
   
  Case pmbutton
    ' ********** Hauptbutton **********
    IF openpmmwindow = "" AND HauptMenu = 0 THEN
      HauptMenu = 1
      Unhide_Obj(mail): Unhide_Obj(games): Unhide_Obj(pc):Unhide_Obj(config): Unhide_Obj(logout)

    ELSEIF openpmmwindow = "" AND HauptMenu = 1 THEN
      clearscr
      HauptMenu = 0
      Hide_Obj(mail): Hide_Obj(games): Hide_Obj(pc): Hide_Obj(config): Hide_Obj(logout)

    END IF
   
  Case games
    ' ********** Game button **********
    Hide_Obj(mail): Hide_Obj(games): Hide_Obj(pc): Hide_Obj(config): Hide_Obj(logout)
    HauptMenu = 0
    SLEEP 250 'pausieren damit klick auf games button nicht auf folgender liste registriert wird
    ScreenLock
    clearscr
    Line ((w/2)-100, (h/2)-125) - STEP(200, 265),Farben.BG1 ,BF
    autowrite (Farben.G2, (w/2)-100+10, (h/2)-125+5, "game wählen", 1)
    ze = (h/2)-125+45
    FOR i = 0 TO 10
      Line ((w/2)-60, ze - 2) - STEP(120, 10),&hFFFFFF ,BF: autowrite (&h000000, (w/2)-60+2, ze, STR(i) & ". " + GameArray(i), 0)
      ze += 20
    NEXT i
    ScreenUnLock
   
    DO
      SLEEP 1
      GETMOUSE (wmaus,hmaus,mrad,mbuttons,mclib)
      ze = (h/2)-125+45 'erste Position der Textfelder
      FOR i = 0 TO 10
        IF mbuttons = 2 THEN ClearScr: EXIT Select
       
      '+++ klick auf 1 von 11 spielen +++
        IF mbuttons = 1 AND wmaus > (w/2)-60 AND wmaus < (w/2)-60+120 AND _
          hmaus > ze - 2 AND hmaus < ze - 2 + 10 AND openpmmwindow = "" THEN
          PlayGame = GameArray(i)
         
          Sleep 200
          ScreenLock
          clearscr
          Line ((w/2)-100, (h/2)-125) - STEP(200, 265),Farben.BG1 ,BF
          autowrite (Farben.G2, (w/2)-100+10, (h/2)-125+5, "online liste", 1)
          autowrite (Farben.G2, (w/2)-100+10, (h/2)-125+25, "empfänger wählen", 0)
          ze = (h/2)-125+45
          FOR i = 0 TO 10
            Line ((w/2)-60, ze - 2) - STEP(120, 10),&hFFFFFF ,BF: autowrite (&h000000, (w/2)-60+2, ze, STR(i) & ". " + TxtArray(i), 0)
            ze += 20
          NEXT i
          ScreenUnLock
   
          DO
            SLEEP 1
            GETMOUSE (wmaus,hmaus,mrad,mbuttons,mclib)
            ze = (h/2)-125+45 'erste Position der Textfelder
            FOR i = 0 TO 10
              IF mbuttons = 2 THEN ClearScr: EXIT Select
       
            '+++ klick auf 1 von 10 verbindungen +++
              IF mbuttons = 1 AND wmaus > (w/2)-60 AND wmaus < (w/2)-60+120 AND _
                hmaus > ze - 2 AND hmaus < ze - 2 + 10 AND openpmmwindow = "" THEN

                FOR i2 = 1 TO UBound(PcOnline)
                  IF LCase(TxtArray(i)) = LCase(RTRIM(PcOnline(i2).Titel)) OR _
                    LCase(TxtArray(i)) = "an alle" THEN
                   
                    IF LCase(TxtArray(i)) = "an alle" THEN
                      Exit For
                    ELSE
                      Empfaenger = PcOnline(i2).ID
                    END IF
         
                    TSNEPlay_SendMSG(Empfaenger, "[--Game--]" & PlayGame)
                    Shell "START " & ExePath & "\Games\" & PlayGame & ".exe"
                    ClearScr
                    EXIT Select
                  END IF 'LCase(TxtArray(i)) =
                NEXT i2
                EXIT DO
              END IF ''+++ klick auf 1 von 10 verbindungen +++
              ze += 20
            NEXT i
          LOOP Until InKey = CHR(27)
          ClearScr
          EXIT DO
        END IF ''+++ klick auf 1 von 10 spielen +++
        ze += 20
      NEXT i
    LOOP Until InKey = CHR(27)
    ClearScr
   
  Case pc
    ' ********** PC button **********
    Hide_Obj(mail): Hide_Obj(games): Hide_Obj(pc): Hide_Obj(config): Hide_Obj(logout)
    PcListeSub
   
  Case logout
    ' ********** Ende button **********
    ENDE
   
  Case mail
    ' ********** Mail button **********
    HauptMenu = 0
    Hide_Obj(mail): Hide_Obj(games): Hide_Obj(pc): Hide_Obj(config): Hide_Obj(logout)
    Sleep 200
    ScreenLock
    clearscr
    Line ((w/2)-100, (h/2)-125) - STEP(200, 265),Farben.BG1 ,BF
    autowrite (Farben.G2, (w/2)-100+10, (h/2)-125+5, "online liste", 1)
    autowrite (Farben.G2, (w/2)-100+10, (h/2)-125+25, "empfänger wählen", 0)
    ze = (h/2)-125+45
    FOR i = 0 TO 10
      Line ((w/2)-60, ze - 2) - STEP(120, 10),&hFFFFFF ,BF: autowrite (&h000000, (w/2)-60+2, ze, STR(i) & ". " + TxtArray(i), 0)
      ze += 20
    NEXT i
    ScreenUnLock
   
    DO
      SLEEP 1
      GETMOUSE (wmaus,hmaus,mrad,mbuttons,mclib)
      ze = (h/2)-125+45 'erste Position der Textfelder
      FOR i = 0 TO 10
        IF mbuttons = 2 THEN EXIT DO
       
      '+++ klick auf 1 von 10 verbindungen +++
        IF mbuttons = 1 AND wmaus > (w/2)-60 AND wmaus < (w/2)-60+120 AND _
          hmaus > ze - 2 AND hmaus < ze - 2 + 10 AND openpmmwindow = "" THEN
          SetText(SendeMail, 2, format (now,"hh:mm") & " " & format (now,"dd-mm-yyyy"))
          SetText(SendeMail, 5, TxtArray(i))
          Unhide_Obj(SendeMail)
         
          NewmailSub
          EXIT DO
        END IF ''+++ klick auf 1 von 10 verbindungen +++
        ze += 20
      NEXT i
    LOOP Until InKey = CHR(27)
    ClearScr

  End Select

   
' ********** Nachrichten verwalten ********** 

' *** einkommende Namensanfrage (PC Name) ***

  MutexLock(MX_incomming)
 
    IF newmail = "#name" THEN
      TSNEPlay_SendMSG(newmailVon, "##" + ENVIRON("computername"))
      newmail = "": newmailVon = 0
    END IF
 
' *** einkommender Name (PC Name) ***

    IF MID(newmail,1 ,2) = "##" THEN
      PcOnline(newmailVon).Titel = MID(newmail, 3, LEN(newmail) - 2)
      PcOnline(newmailVon).ID = newmailVon
      PcOnline(newmailVon).Status = 1
      newmail = "": newmailVon = 0
    END IF

' *** einkommende Spielanfrage ***

    If Mid(newmail, 1, 10) = "[--Game--]" Then
      Dim iMB AS Integer = MessageBox(0, PcOnline(newmailVon).Titel & _
          " möchte " & MID(newmail, 11, LEN(newmail) - 10) & " spielen", "Spielanfrage", _
          MB_YESNO Or MB_ICONQUESTION Or MB_DEFBUTTON2 Or MB_SYSTEMMODAL)
      If iMB = IDYES Then Shell "START " & ExePath & "\Games\" & MID(newmail, 11, LEN(newmail) - 10) & ".exe /" & PcOnline(newmailVon).Titel
      newmail = "": newmailVon = 0
    End If

' *** Sonstige Nachrichten ***

    IF newmail <> "" THEN
      FOR i = 1 TO Ubound(PcOnline)
        IF PcOnline(i).ID = newmailVon THEN
          OPEN ExePath & "\Empfang.dat" FOR RANDOM AS #1 LEN=LEN(PMMin)
          FOR i2 = 1 TO 1000
            GET #1, i2, PMMin
            IF NOT PMMin.Ist = "X" THEN
              PMMin.Seeder = PcOnline(i).Titel
              PMMin.Datum = MID(newmail, 1, 10)
              PMMin.Zeit = MID(newmail, 11, 5)
              PMMin.Mail = MID(newmail, 16, LEN(newmail)-15)
              PMMin.IST = "X"
              PUT #1, i2, PMMin
              CLOSE
              newmail = "": newmailVon = 0
              EXIT FOR ' i2 = 1 TO 1000
            END IF 'NOT PMMin.Ist = "X" THEN
          NEXT i2
        END IF 'PcOnline(i).ID = newmailVon THEN
      NEXT i
    END IF 'newmail <> ""
   
   
  MutexUnLock(MX_incomming)
 
 
' ********** Nachrichten anzeigen **********
 
' +++ Nachricht aus Speicher in Anzeige Array +++
  OPEN ExePath & "\Empfang.dat" FOR RANDOM AS #1 LEN=LEN(PMMin)
  FOR i = 1 TO 1000
    GET #1, i, PMMin
    IF PMMin.IST = "X" THEN
      IF PMMzaehler < 10 THEN
        CreOb(1, 0, 0, 163, 133, 0, "PM1", "", 0, 0, 1, 1)
        CreOb(0, 10, 3, 150, 9, 0, "", PMMin.Zeit+" "+PMMin.Datum, Farben.G2, 1, 0, 0)
        CreOb(0, 10, 23, 143, 87, 0, "", PMMin.Mail, Farben.G2, 1, 0, 0)
        CreOb(0, 10, 113, 48, 9, 0, "", "pmm von ", Farben.G2, 1, 0, 0)
        CreOb(0, 58, 113, LEN(PMMin.Seeder) * 6, 9, 0, "", PMMin.Seeder, Farben.G2, 1, 0, 0)
        PMMin.IST = ""
        PMMin.Mail = ""
        PUT #1, i, PMMin
        PMMzaehler += 1
      ELSE
        EXIT FOR
      END IF 'PMMzaehler < 10
    END IF 'PMMin.IST = "X"
  NEXT i '= 1 TO 1000
  CLOSE

 
' ********** Frage nach NAME der angemeldeten ID ********** 
  MutexLock(MX_ID)
  IF newID > hoechsteID THEN
    REDIM PRESERVE PcOnline(newID) AS Partner
    hoechsteID = newID
    TSNEPlay_SendMSG(newID, "#name")
    newID = 0
  END IF
  IF newID <> 0 THEN
    TSNEPlay_SendMSG(newID, "#name")
    newID = 0
  END IF
   
  MutexUnLock(MX_ID)

' ********** loeschen der abgemeldeten ID ********** 
  MutexLock(MX_LostID)
  IF LostID <> 0 THEN
    FOR i = 1 TO Ubound(PcOnline)
      IF LostID = PcOnline(i).ID THEN
        PcOnline(i).Titel = ""
        PcOnline(i).ID = 0
        PcOnline(i).Status = 0
        LostID = 0
      END IF
    NEXT i
  END IF
  MutexUnLock(MX_LostID)

loop

ENDE
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 07.04.2013, 14:24    Titel: Antworten mit Zitat

Was mir auf den ersten Blick auffällt ist, dass du relativ viele Do-Loop- und For-Next-Anweisungen verschachtelst. Allerdings hast du relativ viele Sleeps mit drinnen. Aufpassen solltest du aber auch bei For-Next, wenn die Größe unbekannt ist, z. B. bei "UBound(PcOnline)". Wenn das hier eine sehr hohe Zahl sein sollte, baut sich natürlich auch da ein Engpass auf und du würdest ein Sleep darin brauchen.

Was mir aber mehr sorgen bereitet ist, dass du für mehrere verschachtelte For-Next immer und immer wieder die Variable i verwendest. Jede Schleife verändert also den Wert der gleichen Variable, weswegen es mich wundert, dass der Code lauffähig sein soll. Hier ein kleines Beispiel:
Code:
Dim As Integer i

For i = 1 To 10
   Print "i aussen:", i
   For i = 1 To 10
      Print "i innen:", i
   Next
Next
Sleep

Dim As Integer j, k

For j = 1 To 10
   Print "j aussen:", j
   For k = 1 To 10
      Print "k innen:", k
   Next
Next
Sleep
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 07.04.2013, 18:31    Titel: Antworten mit Zitat

Danke na klar das klinkt logisch mit nem sleep in den For next, werd ich nachher gleich ausprobieren.

Hab die stellen gefunden mit den verschachtelten For i - das war so nicht geplant - wundert mich auch das es so läuft aber das macht es wirklich. das einzige ist was noch ab und an hakt ist die mausabfrage in der objekte.bi zum anwählen oder verschieben eines objektes. überlege schon die ganze zeit ob das zu lösen ist mit dem maus/tastatur event system.

Edit: so ich hab jetzt in die betreffenden For next ein Sleep 1 eingebaut - komme im Leerlauf damit auf ein Sleep 1232 innerhalb folgendem ScreenLock

Code:

  logd("lock " & Timer, "PM-Log") 'in Logdatei schreiben
  ScreenLock
  ClearScr                'CLS + ShowOb(100, 0)
  ShowOb(1, 99)       '
  IF HauptMenu = 1 THEN
    Line ((w/2)-64, (h/2)-16) - STEP(128, 32),&hAAAAAA ,BF
  END IF
 
  ShowOb(101, 106)
  SetMouseFrame(5, &h000000)
  ScreenUnLock
  logd("Un-lock " & Timer, "PM-Log")


Die Logdatei liefert ein ergebnis von fast 20 sek.
Lock 9256.199052135742
Un-lock 9275.433896508672

Ergebnis: nach ca 10 durchläufen ein Programmabsturtz der nicht gleich vom System gemeldet wurde - aber dafür hab ich eine CPU unter 10% durchgeknallt lachen

im moment wird jedes angelegte Objekt in einem UDT Array gespeichert. Dieses wächst mit jedem angelegtem Obj. und auch verknüpfte Obj. werden darin gespeichert.
meine überlegung geht nun dahin das Array in ein mehrdimensionales zu ändern oder geht das mit UDTs nicht?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 10.04.2013, 19:07    Titel: Antworten mit Zitat

Hi braesident,
probier es so
Code:
For i As Integer = 1 To 5
  ?"a ";i
  For i As Integer = 1 To 5
    ?" b ";i
  Next
Next
Sleep

ich glaube du siehst dann schon den Unterschied happy
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 11.04.2013, 13:36    Titel: Antworten mit Zitat

Ich kann freebasic hier leider gerade nicht ausprobieren, aber die fbc-Option -g sollte bei Ausführung des Programms eine gmon.out o.ä. benannte Datei erzeugen, die man sich dann mit einem GProf-Viewer anschauen kann.

Alternativ kann man unter Linux und OSX Valgrind benutzen um exakte Profile zu erstellen.
valgrind --tool=cachegrind <kommando>
Nach korrekter Beendigung des Programms kann man die callgrind.out.<PID> Datei mit einem viewer betrachten, KCachegrind finde ich da sehr brauchbar für.

Gibt auch kommerzielle Software für sowas, Intel vTune oder AMD CodeXL. Letzteres hab ich aber noch nie benutzt, ist aber afaik kostenlos.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 11.04.2013, 23:12    Titel: Antworten mit Zitat

so hab wieder nen bissel Zeit

Hab jetzt For Next nochmal in der Ref nachgelesen, also theoretisch könnt ich belibig viele For i verschachteln ohne das der richtige Ablauf gestört wird.
Klar ist, das es natürlich unübersichtlich wird und der Fehlersuche auch nicht diehnt.

Hab jetzt fast die ganze Objekte.bi geändert so das nicht mehr soviele For Next gebraucht werden. wenn ich fertig bin sag ich bescheid, hoffe das es dann besser mit der CPU aussieht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 12.04.2013, 17:17    Titel: Antworten mit Zitat

Zitat:
belibig viele For i verschachteln


Also wo hast du das denn gelesen? Volta und ich haben dir immerhin schon Code-Beispiele gegeben, die ganz klar zeigen, dass du zwar For beliebig verschalten kannst, aber jedes mal eine ANDERE Variable als Zähler verwenden musst, da sonst nicht das richtige Ergebnis rauskommt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 12.04.2013, 22:00    Titel: Antworten mit Zitat

MOD hat Folgendes geschrieben:
Also wo hast du das denn gelesen? Volta und ich haben dir immerhin schon Code-Beispiele gegeben, die ganz klar zeigen, dass du zwar For beliebig verschalten kannst, aber jedes mal eine ANDERE Variable als Zähler verwenden musst, da sonst nicht das richtige Ergebnis rauskommt.

Hast du Voltas Code überhaupt getestet bzw. angeschaut? Dann hättest du nämlich gemerkt, dass er wie erwartet funktioniert dank Verschattung.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 12.04.2013, 22:05    Titel: Antworten mit Zitat

Er verwendet ja ANDERE Variablen, im Gegensatz zu meinem Beispiel. Hab mich wohl unglücklich ausgedrückt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz