Sparc,
Well I'll be durned! It does work just as you suggest. But I see that the TSR part never does the T. It keeps running continuously. As soon as it quits executing, it is unloaded from the allocation heap and every shift register it contained is silently flushed down the bit bucket. Furthermore the response time of your TSR is of course linked to the loop cycle time. To be a good well behaved action engine, or a LV2 style functional global, I think it might be nice to just let it stay resident (the SR) in memory and only execute it when needed. [the original problem]
Another clue is that queues (or notifiers etc.) have no life outside of some executing vi. One cannot put something into a queue then stop execution, and expect that something to be there later on. Some VI containing the queue must be executing continuously to keep it alive. The queue does not need to be accessed, just present in an executing VI.
There is one obvious way to get around all this, and it may have some usefulness. That is to go ahead and build the action engine, but don't use a "run once" while loop with uninitialized shift registers. Simply use normal (LV6) style globals for any data retention across time. Then the VI can be dynamically called when needed, and unloaded when finished. The only requirement for this is that the global VI, the VI defining all the global variables, must be statically loaded. For example one of the global variables must be accessed in a top level VI. The memory cost for keeping a handful of variables around is only a small fraction of what would be needed for the dynamically loaded VI. And neither the caller nor the called VI need to stay running.
Paul