 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 06.04.2013, 23:40 Titel: CPU Auslastung zu hoch |
|
|
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 |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 07.04.2013, 00:00 Titel: |
|
|
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 |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 07.04.2013, 00:22 Titel: |
|
|
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 |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 07.04.2013, 14:24 Titel: |
|
|
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 |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 07.04.2013, 18:31 Titel: |
|
|
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%
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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 10.04.2013, 19:07 Titel: |
|
|
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  _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 11.04.2013, 13:36 Titel: |
|
|
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 |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 11.04.2013, 23:12 Titel: |
|
|
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 |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 12.04.2013, 17:17 Titel: |
|
|
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 12.04.2013, 22:00 Titel: |
|
|
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 |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 12.04.2013, 22:05 Titel: |
|
|
Er verwendet ja ANDERE Variablen, im Gegensatz zu meinem Beispiel. Hab mich wohl unglücklich ausgedrückt. |
|
Nach oben |
|
 |
|
|
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.
|
|