Автоматизация и боты

 Помощь      Поиск      Пользователи
Сайт Кибор     Программируемый кликер Кибор     Видео обучение     Заказать бот

 Страниц (4): « 1 2 [3] 4 »   

> Без описания
Dantes3000
Отправлено: 01 Апреля, 2017 - 17:47:03
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 1489
Дата рег-ции: Июнь 2016  
Репутация: 58




Приблизительно так? Это надо в двух таймерах делать, чтобы 10 секунд не ждать? Просто я с gettime не шарю как работать.
Спойлер (Отобразить)
 
 Top
Dantes3000
Отправлено: 02 Апреля, 2017 - 00:46:21
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 1489
Дата рег-ции: Июнь 2016  
Репутация: 58




Спойлер (Отобразить)

Сделал такую штуку...но за 22 минуты работы на полторы минуты отстает, может чуть меньше.
 
 Top
idcco
Отправлено: 02 Апреля, 2017 - 04:00:31
Post Id



Пользователь
Участник


Покинул форум
Сообщений всего: 67
Дата рег-ции: Март 2017  
Репутация: 5




Оно и будет отставать. Обработка всего этого занимает потерянные милисекунды. Зависит от мощности компа... долго объяснять... Короче юзайте getlocaltime для подобных задач.
 
 Top
Dantes3000
Отправлено: 02 Апреля, 2017 - 13:30:20
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 1489
Дата рег-ции: Июнь 2016  
Репутация: 58




Можно, конечно, подстроить, чтобы отставание было минимально, но если я собираюсь делать ботов на продажу, то такое не подойдет((

Как тогда с временем сделать?

в таймере каждую минуту проверять Minute==0, 10, 20, 30, 40 и 50 минут?
 
 Top
idcco
Отправлено: 02 Апреля, 2017 - 14:19:41
Post Id



Пользователь
Участник


Покинул форум
Сообщений всего: 67
Дата рег-ции: Март 2017  
Репутация: 5




Я или туплю спросони или не понимаю почему вам просто не заменить gettime на getlocaltime и не отправлять время а не работу таймера... Вам же нужно проверять и фиксировать не само время, а разницу между time1 и time2. В код не вникал особо, может и упростить можно, может где-то что-то не учел...но принцип понятен, а дальше уж Вы сами...

CODE:
char ch[256];
int i;
string str;
int time1, time2, m=1;

time1=getlocaltime();
time2=time1;
enabletimer(1);

loop()
{
pause(500);
}


CREATE_TIMER(1, 1000)
{
time2=getlocaltime()-time2; //точное время прошедшее с момента последнего срабатывания таймера в милисекундах (чуть больше секунды)

if (getlocaltime()-time1>30000) goto ex; //выход через 30 сек после запуска
else
{
if (m==1)
{
readbuffernet(#ch[0], 256, "zzz", -1);
str=format(#ch[0]);
i=formatsn(str)+time2; //добавляем к тому что скачали time2

str=format(i);
strcpy(#ch[0], str);

m=0;
}
else
{
writebuffernet(#ch[0], size(#ch[0]), "zzz", -1); //сохраняем время в милисекундах

m=1;
}
}

ex:;
}

И кстати... не жирно ли каждую секунду насиловать сервер? Подмигивание

(Отредактировано автором: 02 Апреля, 2017 - 14:37:04)

 
 Top
Dantes3000
Отправлено: 02 Апреля, 2017 - 14:36:18
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 1489
Дата рег-ции: Июнь 2016  
Репутация: 58




getlocaltime() это int Year, Month, DayOfWeek, Day, Hour, Minute, Second, Milliseconds;

Надо сравнивать минуты, а не саму функцию...
(Добавление)
 idcco пишет:
И кстати... не жирно ли каждую секунду насиловать сервер?


Да суть кода такая:
Таймер каждую секунду проверяет не прошло ли 30 сек. Если не прошло - выходит из таймера.
Если прошло - считываем с сервера время, меняем переменную m и в следующий раз через 30 сек уже отправляется на сервер значение+1. Получается сервер "насилуется" раз в 30сек.
 
 Top
idcco
Отправлено: 02 Апреля, 2017 - 14:51:19
Post Id



Пользователь
Участник


Покинул форум
Сообщений всего: 67
Дата рег-ции: Март 2017  
Репутация: 5




Ну да... Загнался спросони слегка. Но главное что Вы меня поняли. Ну замените в коде который я Вам дал все getlocaltime() обратно на gettime(). Отставание будет примерно секунда-две в час. Или можно заморочиться и добавить это:
CODE:
function localms ()
{
int Year, Month, DayOfWeek, Day, Hour, Minute, Second, Milliseconds;
getlocaltime(Year, Month, DayOfWeek, Day, Hour, Minute, Second, Milliseconds);
int ms =
Milliseconds +
Second*1000 +
Minute*60000 +
Hour*3600000 +
...blablablabla смотря сколько вам надо...;
return ms;
}

и заменить все getlocaltime() на localms(). Тогда отставания не будет вообще.
(Добавление)
 Dantes3000 пишет:
Да суть кода такая:
Таймер каждую секунду проверяет не прошло ли 30 сек. Если не прошло - выходит из таймера.
Если прошло - считываем с сервера время, меняем переменную m и в следующий раз через 30 сек уже отправляется на сервер значение+1. Получается сервер "насилуется" раз в 30сек.
Да... не посмотрел куда ex ведет... Все верно тут.
 
 Top
idcco
Отправлено: 02 Апреля, 2017 - 18:58:59
Post Id



Пользователь
Участник


Покинул форум
Сообщений всего: 67
Дата рег-ции: Март 2017  
Репутация: 5




Вот заморочился слегка =))

Функция возвращает сколько точно прошло секунд с 1.01.2016 до системного времени компа.
Сделал бы в милисекундах, но int ограничен (макс 1 млрд вроде), хотя и с милисекундами тоже работает если не брать год, месяц, день, добавить милисекунды и умножить секунды, минуты и часы на 1000.
На месяц счетчик уже не влезет в int.

Этот счетчик заполнится через 30 с копейками лет. Потом просто обновить startYear (последний високосный год) ручками или через сервер...
Хотя фиг его знает что вообще будет через 30 то лет =))
CODE:
function getlocalsec ()
{
int Year, Month, DayOfWeek, Day, Hour, Minute, Second, Milliseconds;
getlocaltime(Year, Month, DayOfWeek, Day, Hour, Minute, Second, Milliseconds);
int daysInThisYear;
int daysToThisYear;
int dayInV = 0;
//возьмем 2016 год за точку отсчета (последний високосный год)
int startYear = 2016;
Year = Year-startYear;
//Узнаем високосность года с 2016 по 2096
int integer = Year/4; //получаем целую часть деления (так работает по умолчанию)
int decimal = Year*100/4 - a*100; //получаем остаток от деления года на 4
int vYears = integer + 1; //определяем количество високосных годов до текущей даты
//фиксируем дополнительный день в текущем году (если он високосный)
if (decimal == 0) dayInV = 1;
//определяем количество дней c начала текущего года
if (Month == 1) daysInThisYear = Day;
if (Month == 2) daysInThisYear = Day + 31;
if (Month == 3) daysInThisYear = Day + 59 + dayInV;
if (Month == 4) daysInThisYear = Day + 90 + dayInV;
if (Month == 5) daysInThisYear = Day + 120 + dayInV;
if (Month == 6) daysInThisYear = Day + 151 + dayInV;
if (Month == 7) daysInThisYear = Day + 181 + dayInV;
if (Month == 8) daysInThisYear = Day + 212 + dayInV;
if (Month == 9) daysInThisYear = Day + 243 + dayInV;
if (Month == 10) daysInThisYear = Day + 273 + dayInV;
if (Month == 11) daysInThisYear = Day + 304 + dayInV;
if (Month == 12) daysInThisYear = Day + 334 + dayInV;
//определяем количество дней в предыдущие годы с 2016 по текущий
daysToThisYear = (Year-vYears)*365 + vYears*366;
//вычисляем время
int sec =
Second +
Minute*60 +
Hour*3600 +
daysInThisYear*86400 + //секунд в текущем году с начала года
daysToThisYear*86400; //секунд с 1.01.16 по 31.12 предыдущего года
return sec;
}


Соответственно, добавьте эту функцию и подправьте Ваш код:
CODE:
char ch[256];
int i;
string str;
int time1, time2, m=1;
time1=getlocalsec();
time2=time1;
enabletimer(1);

loop() pause(500);

CREATE_TIMER(1, 1000)
{
time2=getlocalsec()-time2; //точное время прошедшее с момента последнего срабатывания таймера в секундах (не будет зависеть от работы процессора и отправки)
if (getlocalsec()-time1>30000) goto ex; //выход из таймера через 30 сек после запуска
else
{
if (m==1)
{
readbuffernet(#ch[0], 256, "zzz", -1);
str=format(#ch[0]);
i=formatsn(str)+time2; //добавляем к тому что скачали time2
str=format(i);
strcpy(#ch[0], str);
m=0;
}
else
{
writebuffernet(#ch[0], size(#ch[0]), "zzz", -1); //сохраняем точное время взятое из системы в секундах
m=1;
}
}

ex:;
}
 
 Top
Dantes3000
Отправлено: 02 Апреля, 2017 - 23:54:23
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 1489
Дата рег-ции: Июнь 2016  
Репутация: 58




if (getlocalsec()-time1>30000) goto ex; //тут знак надо поменять...и 30тыщ секунд как-то много)

а может и не надо менять знак, но с логикой явно что-то не то...Срабатывает постоянно и тикает.
 
 Top
idcco
Отправлено: 03 Апреля, 2017 - 03:41:24
Post Id



Пользователь
Участник


Покинул форум
Сообщений всего: 67
Дата рег-ции: Март 2017  
Репутация: 5




Сделать срабатывание в таймере не раз в секунду а раз в 30 секунд CREATE_TIMER(1, 30000) и фиг с ним ))
 
 Top
Страниц (4): « 1 2 [3] 4 »
Сейчас эту тему просматривают: 8 (гостей: 8, зарегистрированных: 0)
« Вопросы и решение проблем »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 




Powered by