I would like to know that can I get the "end of stream" event (or a signal?) without using the mainloop?

I used:
 gst_bus_add_watch (bus, my_bus_callback, NULL);
 to add a watch to catch the "end of stream" signal. But it seems my_bus_callback not been called at all.
Maybe because I did not use
  g_main_loop_run (loop);
  because I have something else to do with my program.
What should  I do?
Should I create a thread and run  g_main_loop_run (loop)  or
this loop is not needed ?