/* * Метод сохраняющий решение вложенной задачи и обновляющий данные текущей задачи. * Входные параметры: * строка с результатом работы очеродной вложенной задачи. * Выходные параметры: * булева переменная сигнализирующая пора ли поставить задачу на выполнение. * Побочные эффекты: * чтение и запись в файл данных задачи; * может быть создан файл задачи %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; } }
/* Метод создает требуемую пользователю задачу и необходимые подзадачи. Все подзадачи распределяются между активными пользователями. Входные параметры: 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; } }