myDC.ru

Здравствуйте, гость ( Вход | Регистрация )

 
53 страниц V  « < 19 20 21 22 23 > »   
Ответить в данную темуНачать новую тему

> Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы)

vicious
сообщение 4.5.2009, 16:18
Сообщение #401


Продвинутый участник
****

Группа: Пользователи
Сообщений: 173
Регистрация: 26.1.2009
Из: Saratov
Пользователь №: 1 965
Спасибо сказали: 7 раз




т.е. вариант только обьявлять переменную глобальной и по удалении таймера переменную делать обратно nul ? тока так?...просто не хотелось ее глобальной объявлять...
Тут вот в чем суть...стандартный информер...выводится текст Новостей из файла по таймеру и плюс при подключении юзера через 10 сек (к примеру)...поэтому хотел при подключении добавлять выполнение это функции по таймеру. А так как в отличии от тупо отправить всем, там присутсвует "кому отправить", то хотел с переменной tUser...надеюсь понятно изложил суть дела!

хм...а так как переменная объявляется при подключении юзера...и таймер к примеру на 10 сек...то эта переменная за 10 сек может изменится легко...т.е. только вариант создавать таблицу, и при подключении юзера добавлять эту переменную в таблицу чтоль?

в таком случае уж лучше сделать две отдельные фцнкции...одну для отсылки всем по таймеру..а другую для отсылки кому-то...и в ней самой использовать таймер...
Go to the top of the page
+Quote Post
Setuper
сообщение 4.5.2009, 16:19
Сообщение #402


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Для этого случая очень подходит структурированное написание скриптов на основе классов)))
То есть создаётся некий класс, который будет следить за отправкой сообщений пользователям.
Go to the top of the page
+Quote Post
vicious
сообщение 4.5.2009, 16:21
Сообщение #403


Продвинутый участник
****

Группа: Пользователи
Сообщений: 173
Регистрация: 26.1.2009
Из: Saratov
Пользователь №: 1 965
Спасибо сказали: 7 раз




блин...как же это реализовать то...надо поднапрячься...чет я не вкурю никак......
Go to the top of the page
+Quote Post
alex82
сообщение 4.5.2009, 17:02
Сообщение #404


Местный
*******

Группа: Неактивированные
Сообщений: 908
Регистрация: 26.12.2008
Пользователь №: 1 574
Спасибо сказали: 1406 раз




Цитата(vicious @ 4.5.2009, 16:21) *
блин...как же это реализовать то...надо поднапрячься...чет я не вкурю никак......

Код
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

Примерно так.
Go to the top of the page
+Quote Post
Tsd
сообщение 4.5.2009, 19:44
Сообщение #405


Продвинутый участник
****

Группа: Пользователи
Сообщений: 176
Регистрация: 11.7.2008
Пользователь №: 171
Спасибо сказали: 182 раза




Setuper, Огромное спасибо за помощь. Хорошо что есть такие кто поможет.
Go to the top of the page
+Quote Post
vicious
сообщение 4.5.2009, 19:45
Сообщение #406


Продвинутый участник
****

Группа: Пользователи
Сообщений: 173
Регистрация: 26.1.2009
Из: Saratov
Пользователь №: 1 965
Спасибо сказали: 7 раз




хм...слушай а помоему и правада этот вариант вполне могет))) Спасибо большо!!! щас буду проверять!!! тока там "do" забыл в одном месте...поправь лучше, а то есть такие, которые не смогут найти сами ошибку)
Go to the top of the page
+Quote Post
zangriEBP
сообщение 8.5.2009, 10:09
Сообщение #407


Участник
**

Группа: Пользователи
Сообщений: 47
Регистрация: 20.4.2009
Пользователь №: 3 112
Спасибо сказали: 1 раз




функция таймера может принимать параметры?
Go to the top of the page
+Quote Post
alex82
сообщение 8.5.2009, 11:16
Сообщение #408


Местный
*******

Группа: Неактивированные
Сообщений: 908
Регистрация: 26.12.2008
Пользователь №: 1 574
Спасибо сказали: 1406 раз




Цитата(zangriEBP @ 8.5.2009, 10:09) *
функция таймера может принимать параметры?
Ей всегда передаётся один параметр - id таймера.
Go to the top of the page
+Quote Post
district
сообщение 10.5.2009, 5:33
Сообщение #409


Постоялец
******

Группа: Пользователи
Сообщений: 454
Регистрация: 17.10.2008
Из: Новосибирск
Пользователь №: 825
Спасибо сказали: 90 раз




Еще вопросик про таймер. Допустим, запустили мы таймер с начальным значением 0, период- секунда. Таймер начал считать : 1,2,3... Вопрос : каково предельное значение, до которого досчитает таймер? Я так понимаю, должно быть такое значение, после которого таймер обнулится и начнет считать заново? Или нет?
Go to the top of the page
+Quote Post
alex82
сообщение 10.5.2009, 6:35
Сообщение #410


Местный
*******

Группа: Неактивированные
Сообщений: 908
Регистрация: 26.12.2008
Пользователь №: 1 574
Спасибо сказали: 1406 раз




Таймер в птоке ничего не считает, он тупо вызывает функцию при каждом срабатывании. Соответственно, функция будет вызываться до тех пор, пока таймер не будет остановлен.
Go to the top of the page
+Quote Post
district
сообщение 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" будет максимальным?
Go to the top of the page
+Quote Post
Setuper
сообщение 10.5.2009, 9:35
Сообщение #412


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




LUA в качестве чисел использует числа "сишного" типа double, поэтому максимальное число - это максимальное число типа double, которое примерно равно 170! (= 7,257E+306)
big_smile.gif
Go to the top of the page
+Quote Post
district
сообщение 10.5.2009, 10:21
Сообщение #413


Постоялец
******

Группа: Пользователи
Сообщений: 454
Регистрация: 17.10.2008
Из: Новосибирск
Пользователь №: 825
Спасибо сказали: 90 раз




:выпучил глаза:
А по-русски? "Скока вешать в граммах"? big_smile.gif
.. в общем, понятно, что "столько не живут". big_smile1.gif Вернее будет, видимо, установить такой предел вручную.
Go to the top of the page
+Quote Post
Setuper
сообщение 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.

Зачем устанавливать предел? Просто не стоит беспокоится о том, что каунтер (счётчик) достигнет какого-то максимального значения.
Go to the top of the page
+Quote Post
district
сообщение 10.5.2009, 15:14
Сообщение #415


Постоялец
******

Группа: Пользователи
Сообщений: 454
Регистрация: 17.10.2008
Из: Новосибирск
Пользователь №: 825
Спасибо сказали: 90 раз




Ну насчет значения я так и понял, оно настолько велико, что точно не доживем.
А возник вопрос вот почему. Есть постоянный секундный счет, и допустим несколько событий (или функций), каждая вызывается с определенным индивидуальным интервалом. Есть еще функция задержки исполнения для одной из функций, если бы задержка начала отрабатываться чуть не доходя обнуления счета, то ждать срабатывания ей пришлось бы неизвестно сколько. Но это так, попутно. А вот вопрос еще злободневный. Что рациональнее, если нужно несколько индивидуальных циклов - завести свою переменную каунтер для каждого цикла и плюсовать к каждой поступенчато с каждым вызовом ОнТаймер, или с каждым вызовом ОнТаймер выполнять что-то вроде :
Код
if math.fmod(count,interval) == 0 then --> вызов соотв. функции
?
Go to the top of the page
+Quote Post
Setuper
сообщение 10.5.2009, 15:31
Сообщение #416


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Оптимальнее будет завести несколько таймеров, по таймеру на функцию
Код
TmrMan.AddTimer(nTimerInterval, sFunctionName)

Использовать каунтер очень не эффективно.
Go to the top of the page
+Quote Post
Nickolya
сообщение 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) рациональнее скорее как тебе надо удалять и добавлять таймеры, расчитывая время до следующей функции и определяя параметр который отвечает за выбор действий в функции таймера.
Go to the top of the page
+Quote Post
district
сообщение 10.5.2009, 17:32
Сообщение #418


Постоялец
******

Группа: Пользователи
Сообщений: 454
Регистрация: 17.10.2008
Из: Новосибирск
Пользователь №: 825
Спасибо сказали: 90 раз




Ну до АПИ2 еще дожить надо.. пока все в рамках АПИ1, потому и вопрос был совершенно конкретный - или/или.
Go to the top of the page
+Quote Post
Nickolya
сообщение 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.: чем больше общий делитель (число, на которое делятся все интервалы таймеров без остатка), тем больше будет табличка кеша всех таймеров. Думаю памяти не жалко big_smile.gif А если изменить 4 таймер в этом примере на 10 часов (36000 секунд), скрипт кушает 9568 кб памяти surrender.gif ^_^
Go to the top of the page
+Quote Post
district
сообщение 11.5.2009, 6:48
Сообщение #420


Постоялец
******

Группа: Пользователи
Сообщений: 454
Регистрация: 17.10.2008
Из: Новосибирск
Пользователь №: 825
Спасибо сказали: 90 раз




Спасибо за участие, функцию запомню, однако же думаю, что при таком расходе памяти и 90 строках кода это не будет хорошей альтернативой ступенчатому счетчику с несколькими переменными-каунтерами и фиксированных в настройках постоянных времени каждого счетчика. big_smile.gif
Go to the top of the page
+Quote Post

53 страниц V  « < 19 20 21 22 23 > » 
Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

Collapse

> Похожие темы

  Тема Ответов Автор Просмотров Последнее сообщение
No new ВАЖНО: Topic has attachmentsМодули для скриптов RusHub
26 Setuper 43 796 21.3.2017, 17:31 Посл. сообщение: Alexey
No new ВАЖНО: Topic has attachmentsВаши Вопросы И Предложения По Поводу Форума
447 Svyat 307 191 20.10.2015, 19:39 Посл. сообщение: Ksan
No New Posts От: Вопросы Разработчикам Скриптов
От темы с ID: 173
0 MIKHAIL 4 090 23.1.2015, 0:56 Посл. сообщение: MIKHAIL
No new Topic has attachmentsВопросы по протоколу NMDC
Делаю программу
26 Master255 27 973 12.1.2015, 0:38 Посл. сообщение: Master255
No New Posts Вопросы к Phazeus по Экзекутору
Мастер может забанить мастера, как решить в Экзекуторе?
1 AndreiDC 5 074 31.10.2014, 19:20 Посл. сообщение: Ksan
No New Posts От: Установка скриптов
От темы с ID: 5657
0 MIKHAIL 4 535 29.7.2014, 23:37 Посл. сообщение: MIKHAIL
No New Posts Установка скриптов
Нужна помощь по установке
2 _wRz_ 6 903 29.7.2014, 16:11 Посл. сообщение: Артём
No new От: Вопросы Разработчикам Скриптов
От темы с ID: 173
29 Wariner 24 773 28.1.2014, 13:11 Посл. сообщение: Alexey
No new Topic has attachmentsВопросы по RusHub
Технические вопросы
316 Jaska 255 864 19.12.2013, 13:59 Посл. сообщение: mod
No new Topic has attachmentsМелкие вопросы
44 Wariner 49 048 19.9.2013, 12:34 Посл. сообщение: Alexey
No New Posts От: Ваши Вопросы И Предложения По Поводу Форума
От темы с ID: 753
3 anila 8 658 28.3.2013, 16:02 Посл. сообщение: настя
No New Posts Единая платформа для скриптов
Обсуждения вопроса создания единой платформы скриптов
5 Enyby 8 550 18.1.2012, 20:15 Посл. сообщение: Setuper
No new Topic has attachmentsПеределка скриптов
Прошу помощи
47 Fe(one)X 39 219 26.12.2011, 15:04 Посл. сообщение: Ksan
No new Topic has attachmentsВопросы Разработчикам Скриптов с SQL
вопросы по скриптам (мелкие вопросы)
101 Wariner 58 314 6.12.2011, 0:34 Посл. сообщение: Enyby
No New Posts От: Вопросы по RusHub
От темы с ID: 2902
4 Otshelnik-Fm 8 048 19.10.2011, 9:23 Посл. сообщение: Mangust

 



RSS Сейчас: 19.5.2024, 10:18