Execution Stack Example
This is more a conceptual demonstration than a shining example. The primary idea here is that we can create a stack of execution events and then call them at run time. Since the order is created at run time and not at compile time, we can insert / change the order as the program is executing.
In the following example source code bellow, we're drawing a scene made up of only two functions for the sake of simplicity. When the program starts, we adds our two render functions to the stack that we want to be called during each Render() call. The Render() Function runs through our array of stacked events calls the function(s) if they exist.
[pbcode]
/*
define the order that Render() should darw the screen.
render will call each function in the execution stack from first
to last.
*/
AddToExectionStack("ClearScreen")
AddToExectionStack("DrawMessages")
// --------------------------------------------------------------------
// MAIN LOOP
// --------------------------------------------------------------------
Do
render()
loop
end
// Render Functions
Function CLearScreen()
cls $102030
EndFunction
Function DrawMessages()
For ylp =0 to getsurfaceheight() step GetTextHeight("|")
text 0,ylp,"Hello World........."
next
EndFunction
/*
----------------------------------------------------------------------------
----------------------------------------------------------------------------
----------------------------------------------------------------------------
---[ EXECUTION STACK ]------------------------------------------------------
----------------------------------------------------------------------------
----------------------------------------------------------------------------
----------------------------------------------------------------------------
This is bare bones version to introduce you to the concept. SO we don't
have any fancy depth sorting or management functiosn that could be attached
to each exectuion event in the stack.
*/
Type tExecutionStack
NameOfFunction$
IndexOfFunction
EndType
Dim ExeStack(0) as tExecutionStack
Function AddToExectionStack(Name$)
if getarrayStatus(ExeStack())=false
Dim ExeStack(0) as tExecutionStack
endif
index=getfreecell(ExeStack())
ExeStack(index)=new tExecutionStack
ExeStack(index).NameOfFunction=Name$
ExeStack(index).IndexOfFunction=FunctionIndex(name$)
EndFunction Index
Function Render()
if getarrayStatus(ExeStack())
// find the depth of the stackl
for lp=1 to getarrayelements(ExeStack())
if ExeStack(lp)
Index=ExeStack(lp).IndexOfFunction
if Index=0
index=FunctionIndex(ExeStack(lp).NameOfFunction$)
ExeStack(lp).IndexOfFunction=Index
endif
if Index>0
CallFunction Index
endif
endif
next
endif
sync
EndFunction
[/pbcode]
Related Examples:
* Action GUI (http://www.underwaredesign.com/forums/index.php?topic=3899.0)
* Abstraction Layer (http://www.underwaredesign.com/forums/index.php?topic=3611.0)