Dantes3000 |
Отправлено: 02 Апреля, 2017 - 00:46:21
|
Эксперт
Покинул форум
Сообщений всего: 1489
Дата рег-ции: Июнь 2016
Репутация: 58
|
Спойлер (Отобразить)char ch[256];
int i;
string str;
int time1, time2, m=1;
time1=gettime();
time2=time1;
enabletimer(1);
loop()
{
pause(500);
}
CREATE_TIMER(1, 1000)
{
time2=gettime();
if (time2-time1<30000) goto ex;
else
{
if (m==1)
{
readbuffernet(#ch[0], 256, "zzz", -1);
str=format(#ch[0]);
i=formatsn(str);
i++;
str=format(i);
strcpy(#ch[0], str);
time1=time2;
m=0;
}
else
{
writebuffernet(#ch[0], size(#ch[0]), "zzz", -1);
time1=time2;
m=1;
}
}
ex:;
}
Сделал такую штуку...но за 22 минуты работы на полторы минуты отстает, может чуть меньше. |
|
|
Dantes3000 |
Отправлено: 02 Апреля, 2017 - 13:30:20
|
Эксперт
Покинул форум
Сообщений всего: 1489
Дата рег-ции: Июнь 2016
Репутация: 58
|
Можно, конечно, подстроить, чтобы отставание было минимально, но если я собираюсь делать ботов на продажу, то такое не подойдет((
Как тогда с временем сделать?
в таймере каждую минуту проверять Minute==0, 10, 20, 30, 40 и 50 минут? |
|
|
idcco |
Отправлено: 02 Апреля, 2017 - 14:19:41
|
Участник
Покинул форум
Сообщений всего: 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) |
|
|
Dantes3000 |
Отправлено: 02 Апреля, 2017 - 14:36:18
|
Эксперт
Покинул форум
Сообщений всего: 1489
Дата рег-ции: Июнь 2016
Репутация: 58
|
getlocaltime() это int Year, Month, DayOfWeek, Day, Hour, Minute, Second, Milliseconds;
Надо сравнивать минуты, а не саму функцию...
(Добавление)
idcco пишет: И кстати... не жирно ли каждую секунду насиловать сервер?
Да суть кода такая:
Таймер каждую секунду проверяет не прошло ли 30 сек. Если не прошло - выходит из таймера.
Если прошло - считываем с сервера время, меняем переменную m и в следующий раз через 30 сек уже отправляется на сервер значение+1. Получается сервер "насилуется" раз в 30сек. |
|
|
idcco |
Отправлено: 02 Апреля, 2017 - 14:51:19
|
Участник
Покинул форум
Сообщений всего: 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 ведет... Все верно тут. |
|
|
idcco |
Отправлено: 02 Апреля, 2017 - 18:58:59
|
Участник
Покинул форум
Сообщений всего: 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:;
} |
|
|
|