Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
progga
Anmeldungsdatum: 26.11.2006 Beiträge: 26
|
Verfasst am: 28.11.2006, 20:24 Titel: DO LOOP |
|
|
Hallo,
ich nutze gerne die do loop schleife um mir z.b live die koordinaten der Maus anzeigenzulassen oder immer live auf was reagieren will wie z.b eine eingabe etc.
doch es viel mir auf das mein prozessor 2,4Ghz dann auch zu 100% ausgelastet ist.
Das passt mir irgenwie nicht denn nichtmal Unreal 2004 nimmt soviel leistung in anspruch......
Wie kann ich auch ohne einer schleife in basic auf was reagieren? Sprich das ein bestimmer Code immer und immer wieder ausgeführt wird aber nicht gleich den Prozessor voll auslastet... ich hoffe Ihr versteht was ich meine.
Danke im vorraus.! |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 28.11.2006, 20:40 Titel: |
|
|
Hi.
Das kommt daher, dass der Code halt dauerhaft ausgeführt wird, was die anderen Prozesse abbremst. Heißt, für den Prozessor/das Betriebssystem sieht es so aus, als würdest du dauernd irgendwelche Rechenoperationen ausführen.
Mach einfach ein
Vor der Zeile mit dem LOOP, dann geht's. Denn dann kann die Kontrolle kurz an andere Prozesse abgegeben werden. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 28.11.2006, 20:41 Titel: |
|
|
Das Problem ist, das du dem Prozessor keine "Verschnaufspause" gibts.
Wenn du irgendwo in der Schleife "Sleep 10" oder "Sleep 1" schreibst, dann sollte die Prozessorlast auf höchstens 1% sinken.
Edit: Verdammt... Schon wieder zu langsam. Kannst du nich vorher mal sagen, dass du auch postest?  _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
progga
Anmeldungsdatum: 26.11.2006 Beiträge: 26
|
Verfasst am: 28.11.2006, 21:15 Titel: |
|
|
Hallo!
Ok, ich knall dann einfach ein sleep rein!
Ich dachte vieleicht gibt es ein "Timer" so ähnlich wie in JavaScript.
Noch eine andere frage ohne noch ein Thread aufzumachen:
Gibt es sowas wie "mousemove" ? Also das nur dann was passiert wenn die Maus bewegt wird?
Ich könnte natürlich in einer schleife eine if abfrage machen:
z.b:
Code: |
do
getmouse x,y,,taste
if x > 0 or y >0 then TU WAS
loop
|
Aber vieleicht gibt es ja einer bessere Methode?
Danke[/code] |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 28.11.2006, 21:23 Titel: |
|
|
@programmierer:
Okay, schreib dir demnächst immer 'ne pm.
@progga:
Das mit dem Timer wäre auch nicht gegangen, da FB ja nicht ereignisgesteuert arbeitet. Heißt, du hättest wieder 'ne Do..Loop-Schleife gebraucht.
Zu dem mit dem "MouseMove"...
as say, FB arbeitet nicht ereignisgesteuert.
Oh, sry...so wie ich das jetzt sehe, was du gemeint hast...
Du müsstest dann halt die ursprünglichen Koordinaten speichern, ungefähr so:
Code: |
Do
GetMouse X, Y, Rad, Taste
If X<>OldX or Y<>OldY Then
' Irgendwas machen
OldX=X
OldY=Y
End If
Sleep 1
Loop
|
Das müsste gehen. Allerdings nicht vergessen: die Zuweisungen von OldX und OldY müssen bleiben! _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
progga
Anmeldungsdatum: 26.11.2006 Beiträge: 26
|
Verfasst am: 28.11.2006, 21:46 Titel: |
|
|
Ok danke!
So wie in deinem Beispiel habe ich es auch schon gemacht, nur wie gesagt man weiss ja nicht was so alles in FB steckt
Ist ziemlich ungewohnt alles ohne Ereignisse zu machen... aber das wird schon!
Danke nochmal! |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 28.11.2006, 23:48 Titel: |
|
|
Es gibt schon etwas, womit man ohne getmouse feststellen kann, ob die Maus bewegt wurde.
Screenevent ist in der CVS Version verfügbar, und macht so etwas möglich:
Code: | '' include fbgfx.bi for some useful definitions
#include "fbgfx.bi"
Dim e As EVENT
screenres 640, 480
Do
If (screenevent(@e)) Then
Select Case e.type
Case EVENT_KEY_PRESS
If (e.scancode = SC_ESCAPE) Then
End
End If
If (e.ascii > 0) Then
Print "'" & e.ascii & "'";
Else
Print "unknown key";
End If
Print " was pressed (scancode " & e.scancode & ")"
Case EVENT_KEY_RELEASE
If (e.ascii > 0) Then
Print "'" & e.ascii & "'";
Else
Print "unknown key";
End If
Print " was released (scancode " & e.scancode & ")"
Case EVENT_KEY_REPEAT
If (e.ascii > 0) Then
Print "'" & e.ascii & "'";
Else
Print "unknown key";
End If
Print " is being repeated (scancode " & e.scancode & ")"
Case EVENT_MOUSE_MOVE '' <---- Maus wurde bewegt
Print "mouse moved to " & e.x & "," & e.y & " (delta " & e.dx & "," & e.dy & ")"
Case EVENT_MOUSE_BUTTON_PRESS
If (e.button = BUTTON_LEFT) Then
Print "left";
Elseif (e.button = BUTTON_RIGHT) Then
Print "right";
Else
Print "middle";
End If
Print " button pressed"
Case EVENT_MOUSE_BUTTON_RELEASE
If (e.button = BUTTON_LEFT) Then
Print "left";
Elseif (e.button = BUTTON_RIGHT) Then
Print "right";
Else
Print "middle";
End If
Print " button released"
Case EVENT_MOUSE_DOUBLE_CLICK
If (e.button = BUTTON_LEFT) Then
Print "left";
Elseif (e.button = BUTTON_RIGHT) Then
Print "right";
Else
Print "middle";
End If
Print " button double clicked"
Case EVENT_MOUSE_WHEEL
Print "mouse wheel moved to position " & e.z
Case EVENT_MOUSE_ENTER
Print "mouse moved into program window"
Case EVENT_MOUSE_EXIT
Print "mouse moved out of program window"
Case EVENT_WINDOW_GOT_FOCUS
Print "program window got focus"
Case EVENT_WINDOW_LOST_FOCUS
Print "program window lost focus"
Case EVENT_WINDOW_CLOSE
End
End Select
End If
Loop |
Der Code ist auf der Seite zu finden, die ich oben verlinkt habe. _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
|