Многопоточные функции в Computer Craft
Я работаю над проектом, в котором я хочу обновлять часы на экране, скажем, каждые 5 секунд, если пользователь что-то не введет. Это код, который у меня есть,
function thread1()
term.clear()
term.setCursorPos(1,1)
write (" SteveCell ")
local time = os.time()
local formatTime = textutils.formatTime(time, false)
write (formatTime)
print ("")
print ("")
for i=1,13 do
write ("-")
end
print("")
print ("1. Clock")
print ("2. Calender")
print ("3. Memo")
print ("4. Shutdown")
for i=1,13 do
write ("-")
end
print ("")
print ("")
write ("Choose an option: ")
local choice = io.read()
local choiceValid = false
if (choice == "1") then
-- do this
elseif (choice == "2") then
-- do that
elseif (choice == "3") then
-- do this
elseif (choice == "4") then
shell.run("shutdown")
else
print ("Choice Invalid")
os.sleep(2)
shell.run("mainMenu")
end
end
function thread2()
localmyTimer = os.startTimer(5)
while true do
local event,timerID = os.pullEvent("timer")
if timerID == myTimer then break end
end
return
end
parallel.waitForAny(thread1, thread2)
shell.run("mainMenu")
К сожалению, это не работает. Если бы кто-то мог помочь мне с этим, я был бы очень признателен. Спасибо:)
2 ответа
Вы хотите сделать что-то вроде этого (я не делаю правильное на экране, только время)
local function thread1_2()
-- both threads in one!
while true do
local ID_MAIN = os.startTimer(5)
local ID = os.startTimer(0.05)
local e = { os.pullEvent() }
if e[1] == "char" then
-- Check all the options with variable e[2] here
print( string.format( "Pressed %s", e[2] ) )
break -- Getting out of the 'thread'
elseif e[1] == "timer" and e[2] == ID then
ID = os.startTimer(0.05) -- shortest interval in cc
redrawTime() -- Redraw and update the time in this function!!!
elseif e[1] == "timer" and e[2] == MAIN_ID then
break
end
end
end
Кроме того, спросите об этом на соответствующем форуме, у вас больше шансов получить ответ там! Еще одно замечание: больше разбирайтесь в обработке событий, это действительно помогает.
К вашему сведению, Lua не имеет многопоточности, как при одновременном выполнении нескольких подпрограмм. Что у него есть, так это "нить парковки". Вы можете переключаться между подпрограммами (уступая) и переключаться обратно, и он возобновится с того места, где остановился, но в любой момент времени будет активна только одна подпрограмма.
Это моя ссылка на Lua, которая подробно объясняет: http://lua-users.org/wiki/CoroutinesTutorial