Многопоточные функции в 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

Другие вопросы по тегам