Автокликер Clickermann :: Форум
		Основной раздел => Общие вопросы => Topic started by: VGK on November 23, 2017, 04:56:45 PM
		
			
			- 
				Задача
 Есть однотипныe процессы отличающихся только временем выполнения
 Есть небходимость выбирать каждыйраз разные и запускать на выполнение
 Я выбираю их в файл Products.txt и далее смотрите код
 Для пары процессов годится и то что я написал, а что делать если их порядка сотни ? (запускаются последовательно)
 SUB(make)
 print ($Product)
 END_SUB
 
 SUB(mysub)
 IF ($Product = "Bread")
 IF($time_Bread < $_time_t)
 make ()
 $time_Bread = $_time_t + $t_Bread
 END_IF
 wait (1)
 END_IF
 
 IF ($Product = "Cheese")
 IF($time_Cheese < $_time_t)
 make ()
 $time_Cheese = $_time_t + $t_Cheese
 END_IF
 wait (1)
 END_IF
 END_SUB
 
 //---------------------------------------------
 TFREADARR("Products.txt", $Products)
 $t_Bread = 1    //  Эти парметры тут указаны для примера,их значения записаны в
 $t_Cheese = 5   //  соответстующей строке ini-файла, типа Хлеб=Пекарня;1;1;240
 //  Хлеб делается в Пекарне 240 секунд ($t_Product = 240)
 
 FOR($i=0, $i < ARRSIZE($Products))
 $Product = $Products[$i]
 mysub()
 END_CYC
- 
				Вопрос не очень понятен. Ты не хочешь прописывать кучу ифов? Здесь:
 IF ($Product = "Bread")
 
 Тогда уходи от прописанных $time_Bread... $time_Cheese
 Cоздавай (читай в) массив "времени выполнения" -  $times_work и там их храни. Для каждого свой, соответственно.
 
 Если массив продуктов $Products всегда один, то создавай массив $times_work всегда весь.
 
 Если $Products всегда разный по составу, но в ini есть все данные для всех продуктов, создавай массив $times_work читая из ini время выполнения, основываясь на данных из $Products.
 
 SUB(mysub)
 IF($times_work[$ind] < $_time_t)
 make ()
 $times_work[$ind] = $_time_t + $times_work[$ind]
 END_IF
 wait (1)
 END_SUB
 
 FOR($i=0, $i < ARRSIZE($Products))
 $Product = $Products[$i]
 $ind = $i
 mysub()
 END_CYC
- 
				попробуй поиграй с GETVAR и SETVAR. вот твой пример который не понятно что делает.
 
 SUB(make)
 print ($Product)
 END_SUB
 
 SUB(mysub)
 
 IF(GETVAR(STRCONCAT("$time_",$Product)) < $_time_t)
 make ()
 SETVAR(STRCONCAT("$time_",$Product), $_time_t + GETVAR(STRCONCAT("$t_",$Product)))
 END_IF
 
 //проверяем
 print(GETVAR(STRCONCAT("$time_",$Product)) - $_time_t)
 
 
 
 END_SUB
 
 //---------------------------------------------
 
 $time_Bread = 0        // GETVAR и SETVAR не работает с необьявленными переменными
 $time_Cheese = 0
 
 TFREADARR("Products.txt", $Products)
 $t_Bread = 1    //  Эти парметры тут указаны для примера,их значения записаны в
 $t_Cheese = 5   //  соответстующей строке ini-файла, типа Хлеб=Пекарня;1;1;240
 //  Хлеб делается в Пекарне 240 секунд ($t_Product = 240)
 
 FOR($i=0, $i < ARRSIZE($Products))
 $Product = $Products[$i]
 mysub()
 END_CYC
 halt
- 
				Всем спасибо за помощь. В итоге получилось, как часики работает. Видео прилагается.
 В очередной раз убедился в том, что самое главное, правильно формулировать вопрос на форуме.
 Но несмотря ни на что мне реально помогли.
 А что мне было нужно ?
 Очень прсто, игра Hay Day.
 Из списка, в котором полторы сотни продуктов, были предварительно выбраны те, которые надо изготовить
 (в примере несколько штук - Хлеб, Сыр ... файл Products.txt).
 Их необходимо изготовить последовательно.
 У всех принцип изготовления одинаков - подпрограмма make (в примере для проверки просто print), одно отличие - разное время изготовления.
 Итого:
 Пирамидку из колец пособирал, другие советы тоже учёл.
 Как теперь всё работает:
 Объявляем в Include переменные $time_Product для всех продуктов ($time_Bread, $time_Cheese, ... и т. д.)
 Для каждого продукта берем время его время изготовления $times_work из Products.ini.
 Запусквются подпрограмма для следующего продукта с соответсвующим счётчиком.
 За время изготовления продукта с самым большим $times_work остальные будут сделаны по несколько раз.
 Ещё раз всем спасибо за помощь.
 ПС. Потоки для данной задачи не подходят и извините, в посте букв больше чем в сценарии.
 
 #include "Define_Time_Product.cms"
 
 SUB(make)
 print ($Product)
 END_SUB
 
 SUB(mysub)
 IF(GETVAR(STRCONCAT("$time_",$Product)) < $_time_t)
 make ()
 SETVAR(STRCONCAT("$time_",$Product), $_time_t + $times_work)
 END_IF
 END_SUB
 //=============================================
 
 UNDEFINE($Products)
 TFREADARR("Products.txt", $Products)
 FOR($i=0, $i < ARRSIZE($Products))
 $Product = $Products[$i]
 $str = INIREAD("Products.ini", $Product)
 STRSEPARATE($str, ";", $Time)
 $times_work = $Time[3]
 UNDEFINE($Time)
 mysub()
 WAIT (1)
 END_CYC
- 
				#include "Define_Time_Product.cms"
 
 SUB($mysub[$i])
 IF(GETVAR(STRCONCAT("$time_",$Product)) < $_time_t)
 make ()
 SETVAR(STRCONCAT("$time_",$Product), $_time_t + $times_work)
 END_IF
 END_SUB
 //=============================================
 
 UNDEFINE($Products)
 TFREADARR("Products.txt", $Products)
 FOR($i=0, $i < ARRSIZE($Products))
 $Product = $Products[$i]
 $str = INIREAD("Products.ini", $Product)
 STRSEPARATE($str, ";", $Time)
 $times_work = $Time[3]
 UNDEFINE($Time)
 $mysub[$i]() ///вызов подпрограммы с названием $mysub[$i]
 $check=1
 WAIT (1)
 END_CYC
 
 вроде и с таким названием подпрограммы вызываются норм. но как то это вводит в ступор, как будто ты чтото этим хотел зделать... смысл называть подпрограмму переменной, даже не переменной, а элементом массива  :-\ ?
 и для чего тебе в цикле FOR переменная $check ?
- 
				Согласен это осталось случайно, было до того как посоветовали Setvar
 убрал