Example #1
0
        public void RunAndWait()
        {
            ThreadPool.QueueUserWorkItem(QueueFiller);
            for (int i = 0; i < _parent.Config.ThreadCount; i++)
            {
                ThreadPool.QueueUserWorkItem(ThreadRender);
            }

            bool completed = false;

            while (!completed)
            {
                EventPassing eventToRaise = null;
                while (true)
                {
                    lock (_syncLock)
                    {
                        if (_raiseEvents.Count > 0)
                        {
                            eventToRaise = _raiseEvents.Dequeue();
                        }
                    }

                    if (eventToRaise == null)
                    {
                        //No more events
                        break;
                    }
                    else
                    {
                        switch (eventToRaise.Type)
                        {
                        case EventPassing.EventType.Begin:
                            _parent.InvokeBeginRendering(
                                _invoker,
                                _group,
                                _scale,
                                eventToRaise.Row,
                                eventToRaise.Col);
                            break;

                        case EventPassing.EventType.Finish:
                            _parent.InvokeFinishRendering(
                                _invoker,
                                _group,
                                _scale,
                                eventToRaise.Row,
                                eventToRaise.Col);
                            break;

                        case EventPassing.EventType.Error:
                            eventToRaise.Result = _parent.InvokeError(
                                _invoker,
                                _group,
                                _scale,
                                eventToRaise.Row,
                                eventToRaise.Col,
                                eventToRaise.Exception);
                            break;

                        default:
                            //Not translated, because it is an internal error that should never happen
                            throw new Exception("Bad event type");     //NOXLATE
                        }
                        eventToRaise.Event.Set();
                        eventToRaise = null;
                    }
                }

                lock (_syncLock)
                {
                    if (_completeFlag == 0 && _raiseEvents.Count == 0)
                    {
                        completed = true;
                    }
                }

                if (!completed)
                {
                    _event.WaitOne(5 * 1000, true);
                }
            }
        }