...by any other means than madly pulsing their input?
The picture illustrates my problem.
The piston was powered up when both spaces between it and the obsidian block were filled with cobblestone. This is perfectly expectable. Now I broke the second piece of cobble, and I'd expect the piston to move the other block. It does not.
How can I get the piston to act in this situation?
(This is a reduced testcase. In my case the situation is more complex; there is a queue of stones blocked, waiting until needed. A piston pushes a block out of the front of that queue on demand, and the location after the removed block should immediately fill as soon as the "on demand" piston retreats. This doesn't happen because the queue even stopped momentarily, is stuck forever.)