Hi, well I don't know DirectShow but I would think your application is already multithreading. You have your main thread and DirectShow is doing its things in another thread/threads. The problem is when you call WaitForSingleObject() you block the main thread until it is signaled from DirectShow and Windows does not have a change to process messages for the dialog. Perhaps you can call WaitForSingleObject() from a timer in the dialog and set the dwMilliseconds parameters to some short timeout, like 100ms. If WaitForSingleObject() returns WAIT_TIMEOUT you know DirectShow is still working. The dialog will then probably handle windows messages like WM_BUTTON_CLICK in the mean time.
Prefered way is probably running the dialog in the third thread. Then you have main thread, dialog thread and DirectShow thread.