1
Vote

RunWorker() not terminating?

description

When Stop() is called on the CapDevice object:
 
public void Stop()
    {
        try
        {
            // Check if the capture device is even running
            if (IsRunning)
            {
                // Yes, stop via the event
                _stopSignal.Set();
 
                // Abort the thread

                _worker.Abort();
                if (_worker != null)
                {
                    // Join
                    _worker.Join(5000);
 
                    // Release
                    Release();
                }
            }
        }
 
Everything seems to work... _Stopsignal is set and the _worker Thread status goes to AbortRequested. Also, the Runworker() will move to the final instructions being: _control.StopWhenReady(); Which is the expected behavior.
 
However, after this the Thread.Join() waiting state inside Stop() never finishes if I don't put the 5000 ms timeout (see above). This means that the _worker Thread never actually finishes.
 
I therefore suspect that there is an issue with the implementation of the hardware interaction or something else that prevents proper execution of _control.StopWhenReady() or even _control.Stop().
 
Could this be confirmed or am I completely missing something here.
 
After _worker.Abort() I expect the _worker Thread to actually fully stop, but it never does...

comments

KrisJ wrote Mar 23, 2009 at 2:45 PM

Could it be that this kind of stuff has something to do with the _control.stop() or _control.StopWhenReady() possibly not working as advertised?

http://social.msdn.microsoft.com/Forums/en-US/windowsdirectshowdevelopment/thread/53563921-6398-491c-999c-3bfaa2f218ca/

Especially the last post about IVideoWindow seems interesting.

KrisJ wrote Mar 24, 2009 at 7:56 PM

I now found out there was no error within the code handling the camera.

The calls related to the worker thread were completely in the wrong order...

Thread.Abort() was called too early. Therefore the while loop in RunWorker() did not exit yet and the thread was aborted before _control.StopWhenReady() could be called...

I have updated code to solve things. If the original author contacts me I could have the new code added to the project.

plexorama wrote Jun 4, 2009 at 1:02 AM

adding the following code in the finally{}-branch within RunWorker() before the "graph = null;"-line solves an issue when reusing/restarting the CapDevice:

snip

graph.Abort();
graph.Disconnect(sourceObject.GetPin(PinDirection.Output, 0));
graph.Disconnect(grabberObject.GetPin(PinDirection.Input, 0));

graph.RemoveFilter(sourceObject);
graph.RemoveFilter(grabberObject);

snip

jmaldonadom wrote Mar 16, 2010 at 5:07 PM

Hi KrisJ, You could post your code? a couple of days I've been struggling with this problem ...

wrote Feb 14, 2013 at 7:20 PM