Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
Здравствуйте, гость ( Вход | Регистрация )
Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
14.5.2009, 16:13
Сообщение
#441
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Да. Так лучше, так как нет привязки к идентификаторам таймеров, которые, как я уже говорил, не желательно использовать
Но в данном варианте есть и плохая сторона, которая заключается в пробегании цикла каждую секунду. |
|
|
14.5.2009, 16:25
Сообщение
#442
|
|
Продвинутый участник Группа: Пользователи Сообщений: 173 Регистрация: 26.1.2009 Из: Saratov Пользователь №: 1 965 Спасибо сказали: 7 раз |
Да...именно это я понимаю..поэтому и интересуюсь насколько это хреново? я видел тут ка то скрипт...который менял дискрипцию юзеров отправляю строук MyInfo кажду секунду и вроде не грузил сильно ничего.
Но все равно интересно насколько большой это сильно ли это отобразиться на ресурсоемкости? ежесекундный таймер будет только один...плюс еще каждый 30 минут будут отсылаться общие новости, в крайнем случае может еще где нить таймер нарисуется потом, но вряд ли! Что скажешь??? просто я уже фиг его знает какой еще лучше способ придумать...ты как-то говорил про классы...но в них я ни бум бум...и пока не хочется в них лезть чтобы написать этот скрипт... может что-нибудь порекомендуешь как еще сделать лучше...более простым методом и менее ресурсоемким...можно впринципе и таймер сделать не секундныйм а скажем 5 секунд....впринципе разница небольшая...разброс от 10 до 15 сек...причем у многих будет меньше 15 сек))) кроме того цикл не будет очень затяжным...так как в течении таблица никогда не будет большой...только при запуске хаба...да в этот за 10 секунд таблица станет солидная... + может стоить добавить break в цикл...после нахождения первого юзера удовлетворяющего условиям? |
|
|
14.5.2009, 16:41
Сообщение
#443
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Скажу, что лучше делать не так, а вот как:
Код local tTimers, iTime, sMsg = {}, 5, "blablabla" function OnStartup() TmrMan.AddTimer(iTime*1000, "ChekTimers") end function UserConnected(tUser) tTimers[tUser.sNick] = os.time() end function UserDisconnected(tUser) tTimers[tUser.sNick] = nil end function ChekTimers() for k, v in pairs(tTimers) do if os.time() - v > iTime then Core.SendToNick(k, sMsg) tTimers[k] = nil end end end Заметь, что тут установлен таймер, который срабатывает каждые 5 секунд. То есть сообщение пользователю отправляется не через 10 секунд после входа, а через какое-то количество секунд, которое колеблется от 5 до 10 секунд. Работает это следующим образом: допустим таймер срабатывает каждые 5 секунд, тогда пусть пользователь вошёл в 5.1 сек, тогда на 10 секунде: (10 - 5.1) = 4.9 < 5, то есть пользователю не отправится сообщение, то есть сообщение отправится после 9.9 секунд после входа. Если пользователь войдёт на 4.9 секунде, то сообщение отправится спустя 5.1 секунд после входа. Я думаю тебе не так уж и важны точные секунды, поэтому интервал от 5 до 10 секунд - это оптимальное решение. Плюс ко всему следует убрать цикл в функции дисконнекта пользователя, как это сделал я (см. код) Сообщение тоже следует выносить за функцию, чтоб оно постоянно не инициализировалось. |
|
|
14.5.2009, 17:16
Сообщение
#444
|
|
Продвинутый участник Группа: Пользователи Сообщений: 173 Регистрация: 26.1.2009 Из: Saratov Пользователь №: 1 965 Спасибо сказали: 7 раз |
Да мне это нравится...)))
Но я бы хотел не меньше 10 секунд (так как этот минимум сколько надо чтобы мельком пробежаться по приветствию которое отсылается юзеру при подключении)... В таком случае думаю можно сделать вот так??? : Код if os.time() - v - 5 >= iTime then Core.SendToNick(k, sMsg) tTimers[k] = nil end И получится что сообщение будет слаться в интервале 10 - 15 секунд, правильно? И еще одно : Код function UserDisconnected(tUser) tTimers[tUser.sNick] = nil end здесь не надо делать проверку "if tTimers[tUser.sNick] then" ??? |
|
|
14.5.2009, 17:24
Сообщение
#445
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
-5 - правильно
Проверку лучше конечно делать, так как она будет выполняться быстрее, чем присвоение nil |
|
|
14.5.2009, 17:27
Сообщение
#446
|
|
Продвинутый участник Группа: Пользователи Сообщений: 173 Регистрация: 26.1.2009 Из: Saratov Пользователь №: 1 965 Спасибо сказали: 7 раз |
Ну чтож...спасибо! пойду ковырять дальше)))
а кстати, разве вне функции можно объявлять переменные через local ? и как это работать то тогда будет? |
|
|
14.5.2009, 17:49
Сообщение
#447
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Будет работать также как и глобальная, но при этом доступ к ней будет быстрее, так как она будет являться локальной. Дело в том, что глобальные переменные доступны везде, а локальные переменные доступны только в текущем окружении. В данном случае такая локальная переменная будет доступна везде в пределах данного файла (окружением данной локальной переменной является файл).
Если ты объявляешь локальную переменную внутри функции, то её окружением является эта функция, если внутри цикла, то окружение - данный цикл. |
|
|
14.5.2009, 17:49
Сообщение
#448
|
|
Продвинутый участник Группа: Пользователи Сообщений: 173 Регистрация: 26.1.2009 Из: Saratov Пользователь №: 1 965 Спасибо сказали: 7 раз |
ок! спасибо
|
|
|
15.5.2009, 11:11
Сообщение
#449
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
А... Чем вас вот такая конструкция не устраивает?
Код local tTimers, iTime, sMsg = {}, 10, "blablabla" function UserConnected(tUser, sData) local iTimerId = TmrMan.AddTimer(iTime*1000) tTimers[iTimerId] = tUser.sNick end RegConnected, OpConnected = UserConnected, UserConnected function OnTimer(iTimerId) if tTimers[iTimerId] then Core.SendToNick(tTimers[iTimerId], sMsg) TmrMan.RemoveTimer(iTimerId) tTimers[iTimerId] = nil end end Тут все само собой, да и никаких проблем с таймерами у меня не возникло, потом не надо удалять ник при выходе пользователя, функция SendToNick не требует наличия его на хабе, при отсутсвии такого ника в списке пользователей он просто не получит сообщение... |
|
|
15.5.2009, 11:26
Сообщение
#450
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Хорошо, что не возникает проблем с таймерами, думаю, что можно и такой код юзать. По поводу удаления ника может возникнуть такая ситуация, что пользователь вошёл, а потом перезашёл на хаб, и в итоге ему отправится 2 сообщения.
|
|
|
15.5.2009, 12:24
Сообщение
#451
|
|
Продвинутый участник Группа: Пользователи Сообщений: 173 Регистрация: 26.1.2009 Из: Saratov Пользователь №: 1 965 Спасибо сказали: 7 раз |
Спасибо...я попробую и эту...
тока тут надо вот так: Код local tTimers, iTime, sMsg = {}, 10, "blablabla" function OnStartup() TmrMan.AddTimer(30*60000,"OnTimer") end function UserConnected(tUser, sData) local iTimerId = TmrMan.AddTimer(iTime*1000,"OnTimer") tTimers[iTimerId] = tUser.sNick end RegConnected, OpConnected = UserConnected, UserConnected function OnTimer(iTimerId) if tTimers[iTimerId] then Core.SendToNick(tTimers[iTimerId], sMsg) TmrMan.RemoveTimer(iTimerId) tTimers[iTimerId] = nil else Core.SendToAll(sMsg) end end а вот тут какие-то траблы возникали...правда чуть чуть другой код был впринципе отличие от первоначальной функции только в следующем: 1-ый вариант было условие Код if tmr and tTimers[tmr] then во этом варианте условие Код if tTimers[iTimerId] then если только трабла в этом была..хотя не вижу чес говоря принципиально разницы...т.к. tmr всегда есть...при обоих таймерах... |
|
|
15.5.2009, 13:36
Сообщение
#452
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
Вот не пойму зачем ты приписываешь OnTimer вторым аргументом
Код local iTimerId = TmrMan.AddTimer(iTime*1000,"OnTimer") эта функция вызывается по умолчанию.А еще меня интересует момент возвращения идентификатора функцией добавления таймера, если посмотреть, то он как-то уменьшается ежесекундно с определенного числа, может в реализации этого какой-то косяк... |
|
|
15.5.2009, 14:29
Сообщение
#453
|
|
Продвинутый участник Группа: Пользователи Сообщений: 173 Регистрация: 26.1.2009 Из: Saratov Пользователь №: 1 965 Спасибо сказали: 7 раз |
Вот не пойму зачем ты приписываешь OnTimer вторым аргументом Код local iTimerId = TmrMan.AddTimer(iTime*1000,"OnTimer") эта функция вызывается по умолчанию.А еще меня интересует момент возвращения идентификатора функцией добавления таймера, если посмотреть, то он как-то уменьшается ежесекундно с определенного числа, может в реализации этого какой-то косяк... 1) Пардон, я просто не знал что автоматом вызывается если функция называется "OnTimer". 2) Про момент возвращения не понял...поясни пожалуйста более простым языком))) |
|
|
15.5.2009, 17:15
Сообщение
#454
|
|
Участник Группа: Пользователи Сообщений: 47 Регистрация: 20.4.2009 Пользователь №: 3 112 Спасибо сказали: 1 раз |
Когда я пытаюсь добавить значение в таблицу вылазит ошибка, если до этого это место в таблице = nil
sServerUrl[#sServerUrl+1].url=string вот та то же побывал table.insert(sServerUrl,{url=string} но это не помогло(какае-то другая ошибка). как правильно добавить значение в таблицу? |
|
|
15.5.2009, 17:31
Сообщение
#455
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Код sServerUrl[table.maxn(sServerUrl) + 1].url = "wsda"
|
|
|
15.5.2009, 17:36
Сообщение
#456
|
|
Участник Группа: Пользователи Сообщений: 47 Регистрация: 20.4.2009 Пользователь №: 3 112 Спасибо сказали: 1 раз |
sServerUrl[table.maxn(sServerUrl) + 1].url =string и sServerUrl[#sServerUrl+1].url=string одно и тоже и одна и таже ошибка =\
Еще раз повтарю: код работает без ошибок только, если на данном месте в таблице уже что-то было (не nil). |
|
|
15.5.2009, 18:02
Сообщение
#457
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
мы же не экстрасенсы! код ошибки в студию!
возможно дело в создании таблицы Код sServerUrl[table.maxn(sServerUrl) + 1] = {}
sServerUrl[table.maxn(sServerUrl) + 1].url = "wsda" |
|
|
16.5.2009, 6:01
Сообщение
#458
|
|
Участник Группа: Пользователи Сообщений: 47 Регистрация: 20.4.2009 Пользователь №: 3 112 Спасибо сказали: 1 раз |
Если сделать как ты предложил то
Цитата lua:45: attempt to index field '?' (a nil value) Дело как раз в создании или можно воспользоваться другой функцией, но я не знаю как. Вот сама таблица Код local sServerUrl={{url="95.154.113.73",port="27015"},{url="95.154.113.73",port="27015"}} Нужно в конец таблицы добавить еще значения. И лучше всего это сделать вот этой функцией: Код table.insert (table, [pos,] value) Вставляет элемент value в позицию pos в table, сдвигая вверх остальные элементы. Значение по умолчанию для pos равно n+1, где n это длина таблицы, таким образом вызов table.insert(t,x) добавляет x в конец таблицы t. Разобрался Код table.insert(sServerUrl,{url=tbl[1],port=tbl[2]}) не в этом коде...
|
|
|
16.5.2009, 10:11
Сообщение
#459
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
если разобрался молодец и просьба на будущее выделяй свой текст кодами и цитатами а то не понятно что у тя вообще написано! пример выше!
|
|
|
18.5.2009, 21:06
Сообщение
#460
|
|
Продвинутый участник Группа: Пользователи Сообщений: 173 Регистрация: 26.1.2009 Из: Saratov Пользователь №: 1 965 Спасибо сказали: 7 раз |
Не подскажите, как скриптом поменять статус пользователя на хабе:
-server -firewall -normal Можно менять в настройках грейлинка к примеру, а в скрипте как? я так понимаю это наверное в MyInfo отсылается... хм...тока что проверил...это не в MyInfoArrival отсылается....хм...а где??? |
|
|
Похожие темы
|
Сейчас: 28.11.2024, 0:40 |