I put the looping logic in B to look for the cancel signal in the
initDialog method, but that prevents the B dialog panel from being
displayed.  How do I get that checking logic to run AND the dialog
to be displayed?

If you insert FORWARD CLASS(SUPER) CONTINUE as the first statement in initDialog, that should start the dialog and control will return to your next statement in your code where you wish to place the loop. 

I assume that in order to keep the user from interacting with the other
controls (other than the cancel button) in A, that I need to disable them
while I have B displaying the "Wait" dialog, and then enable them again
when B has been signalled to terminate.  Is that correct?

Sounds good to me.