/// <summary> /// Waits for merging process and sends finish message to dispatcher. /// </summary> /// <param name="finishMsg">Finish message from worker</param> private void finishRender(RenderingFinishMessage finishMsg) { try { waitForThreads(); //if at least one thread stuck here whole role will stop work //but this sceario is very unlikely m_log.Info("getting flm URI"); double spp = -1; string completedFlmUri = string.Empty; if (!finishMsg.IsError) { completedFlmUri = saveFlmToBlob(m_scene.StartMessage.SessionId); if (m_stopBySpp) { spp = m_scene.StartMessage.RequiredSpp; } else { spp = m_engine.GetSppOfLoadedFLM(); } m_log.Info("Sending message to dispatcher"); } int id = Utils.RoleID(); MergerFinishMessage msg = new MergerFinishMessage(id, m_scene.StartMessage.SessionId, completedFlmUri, spp, finishMsg.IsError); m_dispatcherQueues[finishMsg.SceneID].AddMessage(msg); } catch (Exception e) { m_log.Warning("Error on worker. Probably error with scene. " + e.Message); } }
/// <summary> /// Clears all data after merging making it ready for new scene /// </summary> /// <param name="finishMsg">Render finish message from worker</param> private void cleanup(RenderingFinishMessage finishMsg) { clearSceneContainer(finishMsg.SceneName); m_engine.Cleanup(); m_dispatcherQueues.Remove(finishMsg.SceneID); m_isMerging = false; m_instanceQueue.Delete(); m_abortQueue.Delete(); }
private void interruptRender(string errorMsg) { Trace.TraceError("Exception when processing queue item. Message: '{0}'", errorMsg); m_log.Error("Exception when processing queue item. Message: " + errorMsg); int id = Utils.RoleID(); RenderingFinishMessage finishMessage = new RenderingFinishMessage(id, null, m_sceneID, true); //if error with scene m_mergerHandler.AddMessage(finishMessage); //the best way is just free resources abort(); renderFinished(); }
private void onRenderFinished() { m_engine.Exit(); if (!m_aborted) { int id = Utils.RoleID(); RenderingFinishMessage finishMessage = new RenderingFinishMessage(id, Scene.GetFileName(m_scene.InputPath), m_sceneID, false); m_mergerHandler.AddMessage(finishMessage); //render has been finished } m_isRendering = false; m_log.Info("Timer finished"); }
/// <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); } }