Форум работает в тестовом режиме. Все данные были перенесены со старого сайта 2018 года. Некоторая информация может быть недоступна, например вложения или хайды. Просьба сообщать о данных случаях через функционал "Жалоба", прямо под постом, где отсуствуют данные из хайда или проблемы с вложением.
Могут быть проблемы в "выкидыванием" с форума (слетевшей авторизацией). Нужно собрать статистику таких случаев.
Есть Тема, куда можете сообщить о проблемах с сайтом либо просто передать привет.

цикл в цикле и все это в процедуре

Рег
2 Мар 2016
Сообщения
234
Реакции
0
Нужно написать цикл в цикле и все это в процедуре.

Вот код. Так я пытался это реализовать. Но проверяется лишь первый цикл while CheckItemCount(1647, True) = 1 do begin . А мне нужно чтобы все циклы в процедуре проверялись одновременно и выполняли определенное действие даже если первый цикл не соответствует условиям. Прошу помощи :)
Код:
procedure beg();
begin
delay(1000);
while CheckItemCount(1647, True)  = 1 do begin
  bronk();
  delay(2000);
while CheckItemCount(1648, True) = 1 do begin
   shari();
   delay(2000);
while CheckItemCount(1649, True)  = 1 do begin
 zimenf();
 delay(2000);
end;
end;
end;
end;
 
А почему не так?
Чтобы прямо "одновременно" нужно использовать потоки.
Код:
while (true) do
begin
  delay(10);

  if (CheckItemCount(1647, True) = 1) then
    brank;
  if (CheckItemCount(1648, True) = 1) then
    shari;
  if (CheckItemCount(1649, True) = 1) then
    zimenf;
end;
 
@Krickt,

Знать бы еще как эти потоки делать... Поищу инфу сейчас.
Потому что так решил :
Код:
procedure beg();    нужно написать чтобы при наличии итема бежал к нпс, в случайном порядке итем дают. Поэтому нужна проверка одновременно, всех циклов в процедуре.
begin
delay(1000);
while CheckItemCount(1647, True)  = 1 do begin
  bronk();
  delay(2000);
while CheckItemCount(1648, True) = 1 do begin
   shari();
   delay(2000);
while CheckItemCount(1649, True)  = 1 do begin
 zimenf();
 delay(2000);
end;
end;
end;
end;


begin                        ну и вызов процедуры, с ее окончанием при получении итема.
repeat  
Delay(1000);
beg();
    until CheckItemCount(1646) = 1
 
@SARCAZM, рано я обрадовался. Скрипт и потоки работают правильно, но 3 потока возможно много? Бот просто виснет, иногда лишь до конца доходит.
 
@sasha282, задержку добавь в каждом потоке, delay(10)
сильно производительность не упадет, но нагрузку уменьшит на много
 
@Donator, Задержки стоят, но почему-то перс бегает туда-сюда при 3 потоках. Помогло лишь добавление строки pause после потоков. Но теперь бот виснет ругается красным при выполнении скрипта. Но всеравно выполняет скрипт правильно. Вот если бы не зависал ))


Вот один из моих потоков, в остальных лишь ид другие:

procedure shari;
var string1,string2: string;
begin
delay(1000);
while CheckItemCount(1648, True) = 1 do begin // я думаю while @@@ do begin не работет и все 3 потока срабатывают,
delay (7000); // отсюда и бег туда-сюда. По моей идее while CheckItemCount(1648, True) = 1 do begin
Engine.MoveTo(116096, -177739, -911); //должен проверять наличие итема, если его нет, скрипт останавливается и проверяет заного
Engine.MoveTo(115816, -177743, -920); //и так пока не появится нужный итем. Почему они сразу запускаются не могу понять.
Engine.MoveTo(115470, -178765, -976);
Engine.MoveTo(116705, -179955, -1190);
Engine.MoveTo(116624, -181518, -1451);
Engine.MoveTo(116156, -181446, -1377);
Engine.MoveTo(116169, -181080, -1366);
Engine.Settarget(30517); // Таргет Шари (Shari)
Engine.Dlgopen;
Engine.DlgSel(5);
Delay(1500);
Engine.MoveTo(116171, -181461, -1380);
Engine.MoveTo(116592, -181271, -1403);
Engine.MoveTo(116637, -179905, -1182);
Engine.MoveTo(115497, -178696, -972);
Engine.MoveTo(115855, -177753, -920);
Engine.MoveTo(116115, -177731, -911);
Engine.MoveTo(116263, -177536, -911);
Engine.Settarget(30519); // Таргет Мион (Mion)
Engine.Dlgopen;
Engine.DlgSel(4);
Delay(1500);
Engine.DlgSel(1);
Delay(1500);
Engine.DlgSel(1);
delay (1000);
delay (1000);
end;
end;

А вот вызов потоков :
Код:
begin
repeat  
Delay(1000);
delay(999);
Script.NewThread(@bronk);
delay(1101);
Script.NewThread(@shari);
delay(1003);
Script.NewThread(@zimenf);
delay(1050);                        // если тут добавить pause будет работать правильно, но 1 раз только ))
     until CheckItemCount(1646) = 1
end;
end.
 
@Krickt,

Krickt написал(а):
А почему не так? Чтобы прямо "одновременно" нужно использовать потоки. while (true) do begin delay(10); if (CheckItemCount(1647, True) = 1) then brank; if (CheckItemCount(1648, True) = 1) then shari; if (CheckItemCount(1649, True) = 1) then zimenf; end;
Насколько я понимаю это будет просто повторять часть скрипта, но мне то нужно чтобы по достижению условия скрипт продолжился. Да и тут последовательно будут строки выполняться?
 
Вобщем всем спасибо, сделал. Хотя и не так как я хотел изначально.
Может быть кому-то будет нужно :
Код:
begin
repeat  
  delay(1000);

  if CheckItemCount(1647, True) = 1 then
    bronk();
    delay(1000);
  if CheckItemCount(1648, True) = 1 then
    shari();                                         // пример процедуры есть в моих сообщениях выше.
    delay(1000);
  if CheckItemCount(1649, True) = 1 then
    zimenf();
delay(1050);
     until CheckItemCount(1646, True) = 1
     end;
 
@Krickt, Я скриптописанием занимаюсь 3-4 дня )) Поэтому о связном разговоре в области программирования не может идти и речи :)
 
Назад
Сверху