Esempio n. 1
0
 public void Remove(ILoadingCommand command)
 {
     m_Commands?.Remove(command);
 }
Esempio n. 2
0
        void ILoadingManager.Start()
        {
            m_Complete = false;

            m_Progress = new MultiProgress(m_Commands.Select((iter) => iter.Command).ToArray());

            System.Threading.EventWaitHandle @event = new System.Threading.AutoResetEvent(true);
            var context = System.Threading.SynchronizationContext.Current;

            Task.Run(
                () =>
            {
                //копия для возможности перезагрузки игры
                List <CommandItem> commands = new List <CommandItem>(m_Commands);
                Prepare();

                //пока есть комманды
                while (commands.Count > 0)
                {
                    //получаем комманды, для которых нет зависимостей
                    ILoadingCommand cmd = null;
                    while ((cmd = GetNextCommand()) != null)
                    {
                        //запускаем выполнение комманды
                        context.Post(
                            (postCommand) =>
                        {
                            ((ILoadingCommand)postCommand).Exec(this,
                                                                (cmd) =>
                            {
                                //удаляем из зависимостей
                                RemoveDependency(cmd);
                                @event.Set();
                            });
                        }, cmd);
                    }

                    //ожидание выполнения комманд
                    while ([email protected](15))
                    {
                        foreach (var iter in m_Commands)
                        {
                            context.Post(
                                (postCommand) =>
                            {
                                cmd = postCommand as ILoadingCommand;
                                m_Progress.SetProgress(cmd, cmd.GetProgress());
                            }, iter.Command);
                        }
                    }
                }

                //финализация прогресса
                context.Post(
                    (state) =>
                {
                    m_Progress.SetDone();
                    m_Complete = true;
                    m_OnLoadComplete?.Invoke();
                }, null);


                ILoadingCommand GetNextCommand()
                {
                    var item = commands
                               .FirstOrDefault((iter) => !iter.Dependency.HasDependency);
                    if (item != null)
                    {
                        commands.Remove(item);
                    }
                    return(item?.Command ?? null);
                }

                void RemoveDependency(ILoadingCommand command)
                {
                    foreach (var iter in commands)
                    {
                        iter.Dependency.Remove(command);
                    }
                }

                void Prepare()
                {
                    foreach (var iter in commands)
                    {
                        iter.Dependency.Rebuild(this);
                    }
                }
            });
        }
Esempio n. 3
0
 public void Add(ILoadingCommand command)
 {
     m_Commands?.Add(command);
 }