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"); }
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); }
/// <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); } }
/// <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); } }
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; } }