// Worker thread
private void WorkerThread()
{
var reasonToStop = ReasonToFinishPlaying.StoppedByUser;
try
{
camera.StartAcquisition();
// while there is no request for stop
while (!stopEvent.WaitOne(0, false))
{
// start time
var start = DateTime.Now;
// get next frame
var bitmap = camera.GetImage(15000, false);
framesReceived++;
bytesReceived += bitmap.Width * bitmap.Height * (Bitmap.GetPixelFormatSize(bitmap.PixelFormat) >> 3);
if (NewFrame != null)
{
NewFrame(this, new NewFrameEventArgs(bitmap));
}
// free image
bitmap.Dispose();
// wait for a while ?
if (frameInterval > 0)
{
// get frame duration
var span = DateTime.Now.Subtract(start);
// miliseconds to sleep
var msec = frameInterval - (int)span.TotalMilliseconds;
if ((msec > 0) && (stopEvent.WaitOne(msec, false)))
{
break;
}
}
}
}
catch (Exception exception)
{
reasonToStop = ReasonToFinishPlaying.VideoSourceError;
// provide information to clients
if (VideoSourceError != null)
{
VideoSourceError(this, new VideoSourceErrorEventArgs(exception.Message));
}
}
finally
{
try
{
camera.StopAcquisition();
}
catch
{
}
}
if (PlayingFinished != null)
{
PlayingFinished(this, reasonToStop);
}
}