I feel this is a head-slappingly stupid question, but is there any way to tell when vline~ has finished its run?
It doesn't seem to me a stupid question at all - also I've heard that stupid questions don't exist.
I don't think there's any "direct" way - i.e. any way to have vline itself tell you when he's finished.
However you can certainly achieve what you need. I can think of 2 approaches:
[threshold~] and manage its output bangs
One or the other may result the simpler depending on the context (i.e. assumptions and restrictions about the messages that can come to vline in your particular case).