public void WaitForWorkers(int workersCount, MessageQueue <DispetcherMessage> dispatcherHandler, string sessionGuid, int sceneID, LoopAction action) { MessageQueue <RenderMessage> renderHandler = new MessageQueue <RenderMessage>(); for (int i = 0; i < workersCount; ++i) { IsFreeMessage isFreeMes = new IsFreeMessage(sessionGuid, sceneID); //send check message to worker renderHandler.AddMessage(isFreeMes); } int workersReadyCount = 0; while (workersReadyCount < workersCount) { DispetcherMessage dispMessage = dispatcherHandler.WaitForMessage(typeof(WorkerIsReady), null, action); ++workersReadyCount; } }
public override void Run() { try { Trace.TraceInformation("Listening for queue messages..."); m_log.Info("Worker is started.\nListening for queue messages..."); MessageQueue <RenderMessage> localQueue = null; while (true) { //check if worker is allocated and ready to work RenderMessage rendMes = m_renderHandler.WaitForMessage(typeof(IsFreeMessage)); m_log.Info("IsFreeMessage"); IsFreeMessage isFreeMessage = rendMes as IsFreeMessage; MessageQueue <DispetcherMessage> dispHandler = new MessageQueue <DispetcherMessage>(isFreeMessage.SceneId.ToString()); //create queue to dispatcher thread localQueue = new MessageQueue <RenderMessage>(isFreeMessage.SceneId.ToString()); m_log.Info("sending 'I am ready' message"); dispHandler.AddMessage(new WorkerIsReady(isFreeMessage.SessionId)); //signal to dispatcher: "Ready to work!" m_aborted = false; m_log.Info("/IsFreeMessage"); rendMes = localQueue.WaitForMessage(typeof(ToRenderMessage)); m_log.Info("Got messege: " + rendMes.GetType().Name); m_log.Info("ToRenderMessage start"); ToRenderMessage message = rendMes as ToRenderMessage; initializeRender(message); startRender(); m_log.Info("Abort queue name suffix: " + message.AbortQueueSuffix); startWaitingProcess(message.AbortQueueSuffix); renderFinished(); m_log.Info("/ToRenderMessage"); } } catch (Exception e) { interruptRender(e.Message); } }