예제 #1
0
        private void prepareMerger()
        {
            MergerMessage merMessage = m_mergerHandler.WaitForMessage(typeof(StartMergeMessage));//(StartMergeMessage));

            m_log.Info("StartMergeMessage");
            m_engine.Cleanup();  //make engine ready and set samples number to 0
            m_maxThreadsCount = Environment.ProcessorCount * 2;
            m_threadsCount    = 0;
            StartMergeMessage startMergeMes = merMessage as StartMergeMessage;

            m_scene = new Utils.SceneBlobReferenceMessage(startMergeMes, false, startMergeMes.SceneId);
            m_log.Info("Scene ID: " + startMergeMes.SceneId);
            if (startMergeMes.RenderTime != 0)
            {
                m_totalRenderTime    = startMergeMes.RenderTime * startMergeMes.RenderRoleCnt;               //total time of rendering
                m_oneBatchInPercents = (float)(startMergeMes.UpdateTime * 100.0) / (float)m_totalRenderTime; //one worker update in percents
            }
            if (startMergeMes.RequiredSpp != 0)
            {
                m_stopBySpp = true;
            }
            m_requiredSpp = startMergeMes.RequiredSpp;
            m_log.Info("One worker update = " + m_oneBatchInPercents + "%");
            m_percentageCompleted = 0;                                                                      //rendered part of scene in percents
            m_dispatcherHandler   = new MessageQueue <DispetcherMessage>(startMergeMes.SceneId.ToString()); //create queue to dispatcher thread
            m_dispatcherQueues.Add(startMergeMes.SceneId, m_dispatcherHandler);
            m_instanceQueue = new MessageQueue <MergerMessage>(startMergeMes.SceneId.ToString(), true);
            m_abortQueue    = new MessageQueue <MergerMessage>(startMergeMes.SceneId.ToString() + "abort", true);
            m_log.Info("sending 'I am ready' message");
            m_dispatcherHandler.AddMessage(new MergerIsReady(startMergeMes.SessionId, startMergeMes.SceneId.ToString())); //signal to dispatcher: "Ready to work!"
            m_isMerging = true;
            m_log.Info("/StartMergeMessage");
        }
예제 #2
0
        private bool isAbort()
        {
            //check for abort message
            MergerMessage abortMessage = m_abortQueue.GetMessageByType(typeof(AbortMergeMessage));

            if (abortMessage != null)
            {
                waitForThreads();
                m_log.Info("RenderingAbortMessage. ID: " + m_abortQueue.getSuffix().ToString());
                AbortMergeMessage abortMes = abortMessage as AbortMergeMessage;
                m_engine.Cleanup();
                if (m_dispatcherQueues.ContainsKey(abortMes.SceneID))
                {
                    m_dispatcherQueues[abortMes.SceneID].Delete();
                    m_dispatcherQueues.Remove(abortMes.SceneID);
                }
                clearSceneContainer(abortMes.SceneName);
                m_isMerging = false;
                m_instanceQueue.Clear();
                m_instanceQueue.Delete();
                m_abortQueue.Delete();
                m_log.Info("/RenderingAbortMessage");
                return(true);
            }
            return(false);
        }
예제 #3
0
 /// <summary>
 /// Occurs when merger gets message to merge flm
 /// </summary>
 /// <param name="merMessage">Message from worker</param>
 /// <returns>True is merging process should be ended</returns>
 private bool toMergeMessageEvent(MergerMessage merMessage)
 {
     try
     {
         while (true)
         {
             if (m_threadsCount < m_maxThreadsCount)
             {
                 Thread thread = new Thread(() => updateMessageEvent(merMessage));
                 thread.Start();
                 m_log.Info("New thread started. Thread count: " + m_threadsCount.ToString());
                 break;
             }
             else
             {
                 Thread.Sleep(3000);
             }
         }
         return(false);
     }
     catch (Exception ex)
     {
         m_log.Error("ToMergeMessage ex: " + ex.Message);
         ToMergeMessage            toMergeMessege = merMessage as ToMergeMessage;
         MergerUpdateFailedMessage errMes         = new MergerUpdateFailedMessage(ex.Message, m_scene.StartMessage.SessionId);
         m_dispatcherQueues[toMergeMessege.ID].AddMessage(errMes);
         return(true);
     }
 }
예제 #4
0
        /// <summary>
        /// Occurs when merger gets message of render finish
        /// </summary>
        /// <param name="merMessage">Message from worker</param>
        private bool renderingFinishMessageEvent(MergerMessage merMessage)
        {
            RenderingFinishMessage finishMsg = merMessage as RenderingFinishMessage;

            m_log.Info("RenderingFinishMessage.\nScene ID: " + finishMsg.SceneID);
            m_scene.IncrementFinishedRolesNumber();
            m_log.Info("Instances finished: " + m_scene.InstancesFinished + "\nInstances required: " + m_scene.StartMessage.RenderRoleCnt + " ID: " + finishMsg.SceneID);
            if (m_scene.StartMessage.RenderRoleCnt == m_scene.InstancesFinished)
            {
                finishRender(finishMsg);
                cleanup(finishMsg);
                m_log.Info("Merger finished");
                return(true);
            }
            else
            {
                m_log.Info("Continue with other instances");
                return(false);
            }
        }
예제 #5
0
        private void updateMessageEvent(MergerMessage merMessage)
        {
            m_log.Info("ToMergeMessage. ID: " + m_scene.SceneID.ToString());
            lock (m_downloadFlmLock)
            {
                ++m_threadsCount;
            }
            ToMergeMessage toMergeMessege = merMessage as ToMergeMessage;

            Utils.ThreadLocalSceneBlob threadSceneNode = new Utils.ThreadLocalSceneBlob();
            m_log.Info("InitializeSceneNode. ID: " + m_scene.SceneID.ToString());
            initializeSceneNode(toMergeMessege, threadSceneNode);
            m_log.Info("/InitializeSceneNode. ID: " + m_scene.SceneID.ToString());
            m_log.Info("Merge. ID: " + m_scene.SceneID.ToString());
            merge(threadSceneNode);
            m_log.Info("/Merge. ID: " + m_scene.SceneID.ToString());
            //scene name means .png blob uri
            lock (m_makePicLock)
            {
                if (!m_stopBySpp)
                {
                    m_percentageCompleted += m_oneBatchInPercents;
                }
                if (m_makePicStopwatch.ElapsedMilliseconds > DocConstants.MAKE_PICTURE_HOLDUP)
                {
                    createImage(threadSceneNode.OutputBlob);
                    double spp = m_engine.GetSppOfLoadedFLM();
                    m_log.Info("SPP: " + spp);
                    if (m_stopBySpp)
                    {
                        m_percentageCompleted = (float)((spp * 100.0) / m_scene.StartMessage.RequiredSpp);
                    }
                    m_log.Info("Completed " + m_percentageCompleted);
                    MergerUpdateMessage updateMsg = new MergerUpdateMessage(threadSceneNode.SceneName,
                                                                            m_scene.StartMessage.SessionId, m_percentageCompleted, spp, m_requiredSpp);
                    m_dispatcherQueues[toMergeMessege.ID].AddMessage(updateMsg);
                    m_makePicStopwatch.Restart();
                }
                --m_threadsCount;
            }
        }