WaitEvent() in Blitz3D with userlibs

Blitz3D Forums/Blitz3D Userlibs/WaitEvent() in Blitz3D with userlibs

Teddyfles(Posted 2005) [#1]
I'm trying to recreate the effect of WaitEvent() in Blitz3D. I don't really care about the possible events, I just want my program to be idle and not use my processor's power if I don't do anything.

I tried it using WaitForInputIdle from user32.dll, but that doesn't seem to work. Any suggestions? Think it can be done?


jfk EO-11110(Posted 2005) [#2]
if it's really only the blitz app that you want to watch for events, you could do it with some kind of screensaver mode.

example:


...
old_mx=mx
old_my=my
mx=mousex()
my=mousey()
k=0
for i=1 to 255
 if keydown(i) then 
 k=1
 exit
next
if (k<>0) or (mx<>old_mx) or (my<>old_my)
 lastuseraction=millisecs()
endif

if millisecs()>(lastuseraction-1000) then
 delay 100
endif
...


It will not be completely idle, but it will kind of slumber as soon as the user doesn't interact for a second. I guess the CPU usage will drop to about 5%.

If you want to use real WaitEvent System Calls, take a look at the BlitzWin3D Include Files.


Teddyfles(Posted 2005) [#3]
Thanks jfk, your screensaver idea is an interesting tip, even though it's not really what I need for my current project.

I checked out BlitzWin3D, but the WaitEvent() function only returns an event. It doesn't wait in idle mode, so CPU usage is still high.


EDIT: I just put your screensaver method in my program, and it works better than I thought. The switching between "screensaver" mode (10 fps) and normal mode (50 fps) goes very fast and smooth. Excellent alternative for idle mode!


jfk EO-11110(Posted 2005) [#4]
BTW you may also use a special loop for the "slumber mode", that only checks for user action and won't update the screen, this way you'll reduce the cpu usage even more.


Teddyfles(Posted 2005) [#5]
Oh man! That's kind of daft, that I didn't think of that myself.

This is basicly what I had:
*Check for input*
If MilliSecs() - lastInteraction > 2000 Then
	Delay 100
EndIf
*Draw stuff*

And I didn't even think of adding a simple 'Else':
*Check for input*
If MilliSecs() - lastInteraction > 2000 Then
	Delay 100
Else
	*Draw stuff*
EndIf

Hehe, oh well, thanks again jfk. Task Manager now says my program takes 0% CPU power. :D


EDIT: As a matter of fact, if I remove the 'Delay 100' it still runs at 0% CPU. So I'm going to just let my program check for input at 50 fps and only draw when the user does something. Seems kind of obvious now.