Пример #1
0
        /*
         * Метод сохраняющий решение вложенной задачи и обновляющий данные текущей задачи.
         * Входные параметры:
         * строка с результатом работы очеродной вложенной задачи.
         * Выходные параметры:
         * булева переменная сигнализирующая пора ли поставить задачу на выполнение.
         * Побочные эффекты:
         * чтение и запись в файл данных задачи;
         * может быть создан файл задачи %taskID%.js в папке /Content/data/.
         */
        public bool updateTask(string result)
        {
            try
            {
                //добавим его в нужный файл
                string[] text       = System.IO.File.ReadAllLines(dataFilePath);
                int      dataLength = Convert.ToInt32(text[0]);
                for (int i = 1; i <= dataLength; ++i)
                {
                    if (text[i] == "")
                    {
                        text[i] = result;
                        break;
                    }
                }
                System.IO.File.WriteAllLines(dataFilePath, text);
                //обновим инфу сколько данных в файле
                //код это делающий
                int emptyLines = 0;
                for (int i = 1; i <= dataLength; ++i)
                {
                    if (text[i] == "")
                    {
                        ++emptyLines;
                    }
                }

                if (emptyLines == 0)
                {
                    //далее переписываем файл по стандарту: пример /Content/data/...
                    int      numberOfData;
                    double[] data;
                    string[] args;
                    TaskIO.parseInput(dataFilePath, out numberOfData, out data, out args);
                    dataFilePath = basePath + "/Content/data/" + id.ToString() + ".js";
                    TaskIO.fillDataFile(dataFilePath, data, args);

                    hasChildTask = false;
                    solved       = true;
                    return(true);
                }
                return(false);
            }
            catch (Exception e)
            {
                throw e;
            }
        }
Пример #2
0
        /*
        Метод создает требуемую пользователю задачу и необходимые подзадачи. Все подзадачи распределяются между активными пользователями.
        Входные параметры:
        1) целое число хранящее идентификатор пользователя поставившего задачу (неотрицательное число);
        2) строка хранящая путь к файлу с введенными данными;
        3) строка с именем метода для решения задачи.
        Выходные параметры:
        булева переменная сигнализирующая о том, что задача может быть решена в текущий момент.
        Побочные эффекты:
        создание файлов данных задачи (частично незаполненого) и подзадач (полных) в папке /Content/data.
        */
        public bool createTask(int userId, string filePath, string func)
        {
            try
            {
                DatabaseMediator db = new DatabaseMediator(basePath);//открыли базу
                int taskId = db.getFreeTaskId(); //получаем id задачи
                User[] users = db.getUsersOnlineWithoutTask();//получили список юзеров
                if (users.Length == 0)
                    return false;
                int numberOfData;
                double[] data;
                string[] args;
                TaskIO.parseInput(filePath, out numberOfData, out data, out args);
                int amountOfSubtasks = numberOfData / users.Count();

                //разбиваем файл задачи на подзадачи и помещаем их в /Content/data/???.js
                string masterFile = basePath + "/Content/task/" + taskId + ".js";
                TaskIO.fillTaskFile(masterFile, users.Length, args);
                Task master = new Task(userId, taskId, -1, masterFile, func, basePath);//смотри описание класса Task


                for (int i = 0; i < users.Count(); ++i)
                {
                    int subtaskId = db.getFreeTaskId();
                    int start = i * amountOfSubtasks;
                    int fin = amountOfSubtasks;
                    TaskIO.fillDataFile(basePath + "/Content/data/" + subtaskId + ".js", data.Skip(start).Take(fin).ToArray(), args);

                    Task slave = new Task(-1, subtaskId, taskId, basePath + "/Content/data/" + subtaskId + ".js", func, basePath);
                    db.saveTask(slave);
                    users[i].setTask(slave);
                    db.updateUser(users[i]);
                    signal(users[i].getId());
                }

                master.setChilds(users.Length);
                db.setUserTask(userId, taskId);
                db.saveTask(master);//сохраняем задачу в базу
                db.close();//закрыли базу
                return true;
            }
            catch (Exception e)
            {
                throw e;
            }
        }