2014-12-29 3 views
0

это мой кодЧто я делаю неправильно с этим Lua кодом

function masspoke(serverConnectionHandlerID, clientID, txt) 
    local error = ts3.requestClientPoke(serverConnectionHandlerID, clientID, txt) 
    sleep(1) 
    local error = ts3.requestClientPoke(serverConnectionHandlerID, clientID, txt) 
    if error == ts3errors.ERROR_not_connected then 
     ts3.printMessage(serverConnectionHandlerID, "Error: Not Connected") 
     return 
    elseif error ~= ts3errors.ERROR_ok then 
     print("Getting Error: " .. error .. "by poking the ID: " .. clientID) 
     return 
    end 
    ts3.requestClientPoke(serverConnectionHandlerID, clientID, txt) 
end 

и моя ошибка

попытки вызвать глобальный «сон» (нилъ значения)

+0

Сообщение об ошибке ясно: вы вызываете неопределенную глобальную функцию с именем 'sleep'. – lhf

+0

ok, так как я могу добавить паузу, где я хочу, чтобы она спала. –

+1

Вы находите функцию сна в некоторой библиотеке, которая предоставляет одну или связывает одну из C самостоятельно. –

ответ

1

В Lua нет функции sleep, поэтому вы получаете ошибку. Самый простой способ добиться того, что вы хотите, - использовать socket.sleep, если у вас есть доступ к luasocket. Есть несколько других опций, перечисленных в this и this ВОПРОСЫ.

+0

Я пробовал сокет сна, и я все равно получаю ту же ошибку > попытаться индексировать глобальный «сокет» (значение nil) –

+0

@JoseSeverino, перед вызовом 'socket. Вам нужно использовать' local socket = require 'socket' '. sleep'. –

0

Lua не обеспечивает функцию сна. Есть несколько способов реализовать один as discussed on the Lua wiki, определенно взгляните. Решение на основе сокетов - лучший вариант, чем таймер, потому что он не вращает процессор (он занят), но для этого требуется установка третьей библиотеки sockets. Во всех решениях ваше приложение ничего не может сделать, оно застревает в ожидании времени.

Вы должны спросить, действительно ли вам нужно заблокировать поток в течение заданного времени, то есть, почему бы не использовать цикл while до тех пор, пока не будет выполнено определенное условие. В вашем случае это может быть цикл до тех пор, пока не будет получен статус OK из запроса или не истечет определенное количество времени. Таким образом, цикл завершится, как только будет достигнуто условие «идти вперед», но функция вернется, если для достижения этого состояния потребуется слишком много времени. Другим преимуществом этого является то, что вы можете дать TS-приложению возможность обрабатывать другие события, каждый раз через цикл.

Это будет выглядеть следующим образом (не проверено):

function masspoke(serverConnectionHandlerID, clientID, txt) 
    local start = os.clock() -- start timing 
    local MAX_WAIT_SECS = 1 -- seconds to wait for OK 
    local error = ts3.requestClientPoke(serverConnectionHandlerID, clientID, txt) 
    while error ~= ts3errors.ERROR_ok do 
     if os.clock() - start > MAX_WAIT_SECS then -- too long, give up! 
      if error == ts3errors.ERROR_not_connected then 
       ts3.printMessage(serverConnectionHandlerID, "Error: Not Connected") 
      else 
       print("Getting Error: " .. error .. "by poking the ID: " .. clientID) 
      end 
      return 
     end 
     error = ts3.requestClientPoke(serverConnectionHandlerID, clientID, txt) 
    end 
    -- now that ts poke is ok, do whatever: 
    ts3.requestClientPoke(serverConnectionHandlerID, clientID, txt) 
end 

Я думаю, что выше является экологически чистым подходом, целью является более ясным. Если вы действительно хотите спать основной поток через модуль сокета, а затем поставить это перед вашей masspoke() функции:

require "socket" -- you need to install socket lib manually 
function sleep(sec) 
    socket.select(nil, nil, sec) 
end 

Но есть несколько других вариантов на http://lua-users.org/wiki/SleepFunction, которые должны быть стоит попробовать (в зависимости от платформы, и будет ли вы хотите, чтобы ваша программа запускалась на нескольких платформах или нет), которые не требуют установки сторонней библиотеки. Обязательно внимательно прочитайте эту страницу и проверьте, что она показывает.

+0

Что такое синтаксис цикла и где он размещается –

+0

или где и как я могу реализовать решение на основе сокетов –

Смежные вопросы