Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: VGK on November 23, 2017, 04:56:45 PM

Title: Очередь последовательно выполняемых процессов
Post by: VGK on November 23, 2017, 04:56:45 PM
Задача
Есть однотипныe процессы отличающихся только временем выполнения
Есть небходимость выбирать каждыйраз разные и запускать на выполнение
Я выбираю их в файл Products.txt и далее смотрите код
Для пары процессов годится и то что я написал, а что делать если их порядка сотни ? (запускаются последовательно)
Code: (clickermann) [Select]
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
Title: Re: Очередь последовательно выполняемых процессов
Post by: Vint on November 23, 2017, 07:02:23 PM
Вопрос не очень понятен. Ты не хочешь прописывать кучу ифов? Здесь:
IF ($Product = "Bread")

Тогда уходи от прописанных $time_Bread... $time_Cheese
Cоздавай (читай в) массив "времени выполнения" -  $times_work и там их храни. Для каждого свой, соответственно.

Если массив продуктов $Products всегда один, то создавай массив $times_work всегда весь.

Если $Products всегда разный по составу, но в ini есть все данные для всех продуктов, создавай массив $times_work читая из ini время выполнения, основываясь на данных из $Products.

Code: (clickermann) [Select]
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
Title: Re: Очередь последовательно выполняемых процессов
Post by: dramster on November 25, 2017, 12:18:45 PM
попробуй поиграй с GETVAR и SETVAR. вот твой пример который не понятно что делает.

Code: (clickermann) [Select]
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
Title: Re: Очередь последовательно выполняемых процессов
Post by: VGK on November 26, 2017, 09:00:04 PM
Всем спасибо за помощь. В итоге получилось, как часики работает. Видео прилагается.
В очередной раз убедился в том, что самое главное, правильно формулировать вопрос на форуме.
Но несмотря ни на что мне реально помогли.
А что мне было нужно ?
Очень прсто, игра Hay Day.
Из списка, в котором полторы сотни продуктов, были предварительно выбраны те, которые надо изготовить
(в примере несколько штук - Хлеб, Сыр ... файл Products.txt).
Их необходимо изготовить последовательно.
У всех принцип изготовления одинаков - подпрограмма make (в примере для проверки просто print), одно отличие - разное время изготовления.
Итого:
Пирамидку из колец пособирал, другие советы тоже учёл.
Как теперь всё работает:
Объявляем в Include переменные $time_Product для всех продуктов ($time_Bread, $time_Cheese, ... и т. д.)
Для каждого продукта берем время его время изготовления $times_work из Products.ini.
Запусквются подпрограмма для следующего продукта с соответсвующим счётчиком.
За время изготовления продукта с самым большим $times_work остальные будут сделаны по несколько раз.
Ещё раз всем спасибо за помощь.
ПС. Потоки для данной задачи не подходят и извините, в посте букв больше чем в сценарии.

Code: (clickermann) [Select]
#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
Title: Re: Очередь последовательно выполняемых процессов
Post by: dramster on November 26, 2017, 10:16:13 PM
Code: (clickermann) [Select]
#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 ?
Title: Re: Очередь последовательно выполняемых процессов
Post by: VGK on November 27, 2017, 09:22:57 AM
Согласен это осталось случайно, было до того как посоветовали Setvar
убрал