There are several alternatives to xmessage including zenity and
yad. yad is the most fully featured and is actively being developed.
X applications need to know the name of the X display to open in. Most commonly they get it from the $DISPLAY environment variable. That is set for all processes run within an X session but not when run from cron. If there is only one X display running on the system, you can use export
DISPLAY='localhost:0.0' in the script (you may also need
export LANG=C, I can't remember why
). If the cron job is not being run by the same user as the X display belongs to, the user needs to give the cron user permission to access their X display using the
xauth command.
Regards the script continuing while the message remains on screen, it should (TM) be possible to "background" the message command using &, note its process ID from the value of $! and then kill it when the script has finished and displays the "Process finished" message.
If using yad, you may find the --on-top and --sticky options useful. IDK if they are available in the alternatives.