| 
				
					|  | 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, 22: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: 06.04.2013, 23: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: 06.04.2013, 23: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, 13: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, 17: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, 18: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, 12: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, 22: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, 16: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, 21: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, 21: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.
 
 |  |