This is a read-only snapshot of the ComputerCraft forums, taken in April 2020.
joviboy's profile picture

Multiple Functions Active at once

Started by joviboy, 06 October 2013 - 09:04 AM
joviboy #1
Posted 06 October 2013 - 11:04 AM
Multiple Functions Active at once

Is it possible to keep 2 functions activated at once? Like an ingame clock while you're on a menu? Or a fuel meter while still waiting for a keypress in a menu function?
svdragster #2
Posted 06 October 2013 - 01:02 PM
You want to use the parallel Api.
MKlegoman357 #3
Posted 06 October 2013 - 03:23 PM
Parallel API allows you to run more than one function at once. You can use it like this:


local function log () --//This will log every event into a file called "events.log"
  while true do
    local event = {os.pullEvent()}
    local file = fs.open("events.log", "a")

    file.writeLine(table.concat(event, ","))
    file.close()
  end
end

local function input () --//This is just an example function that will ask your name
  print("What is your name?")

  local name = read()

  print("Hello, " .. name .. ". Your identity has been stolen by nobody. Have a nice day!")
end

--//To run those functions at the same time we can use parallel API like this:

parallel.waitForAny(log, input)

--//As you can see, we just pass our functions into parallel.waitForAny and now they will be running together,
--//it will ask your name while logging everything you type into a file called "events.log".

--//There is one problem with parallel.waitForAny: when one function stops, every other functions stops too.
--//But what if you want to leave other functions running when one is stopped?
--//In my example, when this program will get your name it will no longer log the events.
--//To keep "log" function still running we can use this:

parallel.waitForAll(log, input)
Edited on 07 October 2013 - 07:09 AM
LBPHacker #4
Posted 07 October 2013 - 12:27 AM
fs.open("events.log", "r")
Very nice answer except for that file which is opened in read mode - append mode would be better.
joviboy #5
Posted 07 October 2013 - 01:40 AM
Thank you very much!

EDIT: but how do I fit it into my program? Can't seem to find the right place :(/>

local menuOptions  = {"Brench Miner", "Quarry Miner", "Console", "Restart", "Shutdown"}
local termX, termY = term.getSize() --Get the terminal size
local selected = 1 --The selected menu item

function inserText(text, termY)
--term.setCursorPos(termX/2-#text+1/2,termY)
term.setCursorPos(16,termY+4)
term.write(text)
return true
end

function centerText(text, termY)
term.setCursorPos(termX/2-#text/2,termY)
term.write(text)
return true
end

function ingameclock()
while true do
  term.clear()
  local intime = textutils.formatTime(os.time(), true)
  local inday = os.day()
  local x = 0;

  term.clear()
  term.setBackgroundColor(colors.blue)
  term.setCursorPos(1,2)
  write("																			 ")
  term.setBackgroundColor(colors.black)
  term.setCursorPos(2,2)
  if os.time() > 19 or os.time() < 6 then
   term.setTextColor(colors.red)
  else
   term.setTextColor(colors.white)
  end
  write("[")
  term.setTextColor(colors.white)
  term.setCursorPos(3,2)
  write("0")
  term.setCursorPos(8-#intime,2)
  write(intime)
  if os.time() > 19 or os.time() < 6 then
   term.setTextColor(colors.red)
  else
   term.setTextColor(colors.white)
  end
  write("]")

  term.setTextColor(colors.white)
  term.setCursorPos(51-12+2,2)
  write("[DAY: ")
  write("000")
  term.setCursorPos(51-12+11-#tostring(inday),2)
  write(inday)
  term.setTextColor(colors.white)
  write("]")
  sleep(0,8)
end
end

function start()
while true do
  term.setTextColor(colors.lime)
  term.setBackgroundColor(colors.black)
  term.setCursorPos(1,1)
  centerText("Main Menu", 1)
  term.setCursorPos(1,18)
  term.setTextColor(colors.yellow)
  print("---------------------------------------------------")
  centerText("UP / DOWN - ENTER", 19)
  term.setBackgroundColor(colors.black)
  term.setTextColor(colors.lightGray)
  for i,v in ipairs(menuOptions) do
   if i == selected then
		term.setBackgroundColor(colors.orange)
  term.setCursorPos(16,i+4)
  write("				")
  term.setTextColor(colors.white)
  inserText(i.."> "..v, i)
  term.setBackgroundColor(colors.black)
  term.setTextColor(colors.lightGray)
   else
		inserText(i.."> "..v,i)
   end
  end
  x,y = os.pullEvent() --Get user input
  if y == keys.down and selected < #menuOptions then
   selected = selected + 1
  elseif y == keys.up and selected > 1 then
   selected = selected - 1
  elseif y == keys.enter then
   return selected
  end
end
end

x = start()
print()
print("You selected option: ".. menuOptions[x])
term.setTextColor(colors.green)
print("restarting program lol")
sleep(1)
term.clear()
shell.run("startmenu")
jay5476 #6
Posted 07 October 2013 - 03:17 AM
well basically this is an explaination of the parallel api
there are to functions:
parallel.waitForAny and parallel.waitForAll you can use both of them like

parallel.waitForAny(func1,func2,func3) --etc.
parallel.waitForAll(func1,func2,func3) --etc.
parallel.waitForAny can be used to simulate simultaneous running of functions
by running 1 function until it yields then doing the same for the next function

parallel.waitForAll waits for 1 function to finish before running the next