Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
Здравствуйте, гость ( Вход | Регистрация )
Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
4.5.2009, 16:18
Сообщение
#401
|
|
Продвинутый участник Группа: Пользователи Сообщений: 173 Регистрация: 26.1.2009 Из: Saratov Пользователь №: 1 965 Спасибо сказали: 7 раз |
т.е. вариант только обьявлять переменную глобальной и по удалении таймера переменную делать обратно nul ? тока так?...просто не хотелось ее глобальной объявлять...
Тут вот в чем суть...стандартный информер...выводится текст Новостей из файла по таймеру и плюс при подключении юзера через 10 сек (к примеру)...поэтому хотел при подключении добавлять выполнение это функции по таймеру. А так как в отличии от тупо отправить всем, там присутсвует "кому отправить", то хотел с переменной tUser...надеюсь понятно изложил суть дела! хм...а так как переменная объявляется при подключении юзера...и таймер к примеру на 10 сек...то эта переменная за 10 сек может изменится легко...т.е. только вариант создавать таблицу, и при подключении юзера добавлять эту переменную в таблицу чтоль? в таком случае уж лучше сделать две отдельные фцнкции...одну для отсылки всем по таймеру..а другую для отсылки кому-то...и в ней самой использовать таймер... |
|
|
4.5.2009, 16:19
Сообщение
#402
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Для этого случая очень подходит структурированное написание скриптов на основе классов)))
То есть создаётся некий класс, который будет следить за отправкой сообщений пользователям. |
|
|
4.5.2009, 16:21
Сообщение
#403
|
|
Продвинутый участник Группа: Пользователи Сообщений: 173 Регистрация: 26.1.2009 Из: Saratov Пользователь №: 1 965 Спасибо сказали: 7 раз |
блин...как же это реализовать то...надо поднапрячься...чет я не вкурю никак......
|
|
|
4.5.2009, 17:02
Сообщение
#404
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
блин...как же это реализовать то...надо поднапрячься...чет я не вкурю никак...... Код tTimers = {} function OnStartup() TmrMan.AddTimer(60000*5,"MainTimer") end function UserConnected(user) local tmr = TmrMan.AddTimer(1000*10,"MainTimer") tTimers[tmr] = user.sNick end function UserDisconnected(user) for tmr in pairs(tTimers) do if tTimers[tmr] == user.sNick then tTimers[tmr] = nil break end end end function MainTimer(tmr) local msg = "blablabla" if tmr and tTimers[tmr] then local user = Core.GetUser(tTimers[tmr]) if user then Core.SendToUser(user,msg) end TmrMan.RemoveTimer(tmr) tTimers[tmr] = nil else Core.SendToAll(msg) end end Примерно так. |
|
|
4.5.2009, 19:44
Сообщение
#405
|
|
Продвинутый участник Группа: Пользователи Сообщений: 176 Регистрация: 11.7.2008 Пользователь №: 171 Спасибо сказали: 182 раза |
Setuper, Огромное спасибо за помощь. Хорошо что есть такие кто поможет.
|
|
|
4.5.2009, 19:45
Сообщение
#406
|
|
Продвинутый участник Группа: Пользователи Сообщений: 173 Регистрация: 26.1.2009 Из: Saratov Пользователь №: 1 965 Спасибо сказали: 7 раз |
хм...слушай а помоему и правада этот вариант вполне могет))) Спасибо большо!!! щас буду проверять!!! тока там "do" забыл в одном месте...поправь лучше, а то есть такие, которые не смогут найти сами ошибку)
|
|
|
8.5.2009, 10:09
Сообщение
#407
|
|
Участник Группа: Пользователи Сообщений: 47 Регистрация: 20.4.2009 Пользователь №: 3 112 Спасибо сказали: 1 раз |
функция таймера может принимать параметры?
|
|
|
8.5.2009, 11:16
Сообщение
#408
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
|
|
|
10.5.2009, 5:33
Сообщение
#409
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Еще вопросик про таймер. Допустим, запустили мы таймер с начальным значением 0, период- секунда. Таймер начал считать : 1,2,3... Вопрос : каково предельное значение, до которого досчитает таймер? Я так понимаю, должно быть такое значение, после которого таймер обнулится и начнет считать заново? Или нет?
|
|
|
10.5.2009, 6:35
Сообщение
#410
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Таймер в птоке ничего не считает, он тупо вызывает функцию при каждом срабатывании. Соответственно, функция будет вызываться до тех пор, пока таймер не будет остановлен.
|
|
|
10.5.2009, 6:46
Сообщение
#411
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Сформулирую яснее.
Код sBot = "Bot" local c = 0 function Main() SetTimer(1000) Start Timer() end function OnTimer() c = c + 1 SendToAll(sBot, c) end Какое значение "c" будет максимальным? |
|
|
10.5.2009, 9:35
Сообщение
#412
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
LUA в качестве чисел использует числа "сишного" типа double, поэтому максимальное число - это максимальное число типа double, которое примерно равно 170! (= 7,257E+306)
|
|
|
10.5.2009, 10:21
Сообщение
#413
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
:выпучил глаза:
А по-русски? "Скока вешать в граммах"? .. в общем, понятно, что "столько не живут". Вернее будет, видимо, установить такой предел вручную. |
|
|
10.5.2009, 13:01
Сообщение
#414
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
170! читается так: 170 факториал и означает 1*2*3*4* ... *169*170. Это примерно равно 10 в степени 306.
Зачем устанавливать предел? Просто не стоит беспокоится о том, что каунтер (счётчик) достигнет какого-то максимального значения. |
|
|
10.5.2009, 15:14
Сообщение
#415
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Ну насчет значения я так и понял, оно настолько велико, что точно не доживем.
А возник вопрос вот почему. Есть постоянный секундный счет, и допустим несколько событий (или функций), каждая вызывается с определенным индивидуальным интервалом. Есть еще функция задержки исполнения для одной из функций, если бы задержка начала отрабатываться чуть не доходя обнуления счета, то ждать срабатывания ей пришлось бы неизвестно сколько. Но это так, попутно. А вот вопрос еще злободневный. Что рациональнее, если нужно несколько индивидуальных циклов - завести свою переменную каунтер для каждого цикла и плюсовать к каждой поступенчато с каждым вызовом ОнТаймер, или с каждым вызовом ОнТаймер выполнять что-то вроде : Код if math.fmod(count,interval) == 0 then --> вызов соотв. функции ?
|
|
|
10.5.2009, 15:31
Сообщение
#416
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Оптимальнее будет завести несколько таймеров, по таймеру на функцию
Код TmrMan.AddTimer(nTimerInterval, sFunctionName) Использовать каунтер очень не эффективно. |
|
|
10.5.2009, 15:35
Сообщение
#417
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
1) если это апи 2 то не проще сделать сколько тебе надо вызовов по таймеру функции:
Код TmrMan.AddTimer(1000*10, "Function1") TmrMan.AddTimer(1000*55, "Function2") TmrMan.AddTimer(1000*70, "Function3") TmrMan.AddTimer(1000*1200, "Function4") fucntion Function1() Core.SendToAll"ya funksita 1 :D" end -- i tak dalee 2) если так нельзя - можно вычислить число, которое делится на любое из всех этих, если без заморочек - просто все их перемножив, и по достижении этого счета таймера его обнулять. 3) рациональнее скорее как тебе надо удалять и добавлять таймеры, расчитывая время до следующей функции и определяя параметр который отвечает за выбор действий в функции таймера. |
|
|
10.5.2009, 17:32
Сообщение
#418
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Ну до АПИ2 еще дожить надо.. пока все в рамках АПИ1, потому и вопрос был совершенно конкретный - или/или.
|
|
|
11.5.2009, 3:12
Сообщение
#419
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
Вот склепал принципиально функцию множественных таймеров для 1 апи:
CODE tTimers = { -- таблица с таймерами и функциями { iTimeInterval = 7, -- интервал в секундах для выполнения фунции fFunction = function() -- сама функция SendToAll"функция 1 выполнена: 7 sec" end, }, { -- и так сколько угодно таймеров iTimeInterval = 20, fFunction = function() SendToAll"функция 2 выполнена: 20 sec" end, }, { iTimeInterval = 5, fFunction = function() SendToAll"функция 3 выполнена: 5 sec" end, }, { iTimeInterval = 5, fFunction = function() SendToAll"функция 4 выполнена: 5 sec" end, }, } function Main() MakeTimers() -- выполнение функции подсчета времени загрузки таймеров, должна быть в Main() end -- далее обе функции служебные, их трогать не надо! function MakeTimers() tTimesData = {} local tTimersIntervals = {} local tInt = {} table.sort(tTimers, function(s1, s2) return s1.iTimeInterval < s2.iTimeInterval end) for i, tData in ipairs(tTimers) do tInt[tData.iTimeInterval] = true end local iMn = 1 for i in pairs(tInt) do iMn = iMn * i end for i = tTimers[1].iTimeInterval, iMn do local iCount = 0 for v, tData in ipairs(tTimers) do if math.ceil(i/tData.iTimeInterval) == i/tData.iTimeInterval then if not tTimersIntervals[i] then tTimersIntervals[i] = {i*1000, {}} end table.insert(tTimersIntervals[i][2], v) iCount = iCount + 1 end end if iCount == #tTimers then break end end for i, v in pairs(tTimersIntervals) do table.insert(tTimesData, v) end table.sort(tTimesData, function(s1, s2) return s1[1] < s2[1] end) for i, tData in ipairs(tTimers) do tTimers[i] = tData.fFunction end iCutTimer = 1 SetTimer(tTimesData[iCutTimer][1]) StartTimer() collectgarbage("collect") end function OnTimer() -- это и правда лучше не трогать! for _, i in ipairs(tTimesData[iCutTimer][2]) do tTimers[i]() end if iCutTimer ~= #tTimesData then iCutTimer = iCutTimer + 1 SetTimer(tTimesData[iCutTimer][1] - tTimesData[iCutTimer-1][1]) else iCutTimer = 1 SetTimer(tTimesData[iCutTimer][1]) end collectgarbage("collect") end Здесь при запуске скрипта он просчитывает время запуска каждой функции и просто меняет таймер до следующего вызова, так, что не надо будет проверять по ежесекундному таймеру какие-то параметры. Вот результат работы сия чуда: Цитата [04:07:06] функция 4 выполнена: 5 sec [04:07:06] функция 3 выполнена: 5 sec [04:07:08] функция 1 выполнена: 7 sec [04:07:11] функция 4 выполнена: 5 sec [04:07:11] функция 3 выполнена: 5 sec [04:07:15] функция 1 выполнена: 7 sec [04:07:16] функция 4 выполнена: 5 sec [04:07:16] функция 3 выполнена: 5 sec [04:07:21] функция 4 выполнена: 5 sec [04:07:21] функция 3 выполнена: 5 sec [04:07:21] функция 2 выполнена: 20 sec P.S.: создается 3 глобальных переменных: tTimers - сама таблица с таймерами, iCutTimer - текущий таймер, tTimesData - таблица с интервалами и таймерами по ним работающими. P.P.S.: чем больше общий делитель (число, на которое делятся все интервалы таймеров без остатка), тем больше будет табличка кеша всех таймеров. Думаю памяти не жалко А если изменить 4 таймер в этом примере на 10 часов (36000 секунд), скрипт кушает 9568 кб памяти ^_^ |
|
|
11.5.2009, 6:48
Сообщение
#420
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Спасибо за участие, функцию запомню, однако же думаю, что при таком расходе памяти и 90 строках кода это не будет хорошей альтернативой ступенчатому счетчику с несколькими переменными-каунтерами и фиксированных в настройках постоянных времени каждого счетчика.
|
|
|
Похожие темы
|
Сейчас: 28.11.2024, 0:36 |