Jump to content
  • Sky
  • Blueberry
  • Slate
  • Blackcurrant
  • Watermelon
  • Strawberry
  • Orange
  • Banana
  • Apple
  • Emerald
  • Chocolate
  • Charcoal
  • 0
Gladox114

thread multitasking

Question

4 answers to this question

Recommended Posts

  • 0

Well, I haven't done something similar yet, so I don't know if there's a way to have a program with and while loop running in the background, I did some quick test with coroutines, but it didn't seem to work.

What would work is to use an event driven program, but that would require you to do some rewriting of your code.

So what you would do is registering some events with event.listen(event_type, callback) and then having the corresponding callback do your stuff.

For periodically stuff like checking your me system for items or whatever, you can register timers that are repeated infinitely with event.timer(interval, callback, math.huge), doing stuff that need to be triggered by time and not some user input or incoming modem messages or sth like that.

That way, open os would run with the me programming running simultaneously.

Link to post
Share on other sites
  • 0

So I did some small changes to  your AE2Crafting.lua file, it should work now as intended.

I wasn't able to test it yet, so tell me if it works or not.

-- Original by Palagius : https://oc.cil.li/index.php?/topic/1426-ae2-level-auto-crafting/
-- Modfied by Dalden 2018-07-28
--           - Store crafting result object to check for status
--           - If crafting job is not yet finished from previous cycle then skip this cycle
local arg = {...}
if not arg[1] then
arg[1] = "009" else arg[1] = tostring(arg[1]) end
if not arg[2] then
arg[2] = "ac7" else arg[2] = tostring(arg[2]) end
local component = require("component")
local term = require("term")
--local thread = require("thread")
local event = require("event")
local meController = component.proxy(component.me_controller.address)
local gpu2p = component.proxy(component.get(arg[1]))
local screen2 = component.get(arg[2])
local count = 0
startScreen(arg[1],arg[2])
gpu2p.setForeground(0xFFFFFF)
--term.setViewport(nil, nil, nil, nil, nil, nil, window)
 
 
-- Each element of the array is "item", "damage", "number wanted", "max craft size"
-- Damage value should be zero for base items
 
items = {
    { "minecraft:coal",      1, 100, 300 }
--    { "minecraft:coal_block",       0, 10, 256 }
--    { "minecraft:iron_ingot",       0, 16384, 256 },
--    { "minecraft:gold_ingot",       0, 16384, 256 },
--    { "minecraft:glass",      0, 16384, 256 },
--    { "minecraft:quartz",      0, 16384, 256 },
--    { "minecraft:diamond",      0, 16384, 256 },
--    { "minecraft:emerald",      0, 16384, 256 },
--    { "draconicevolution:draconium_ingot",      0, 16384, 256 },
--    { "thermalfoundation:material",       128, 1024, 256 }, -- Copper Ingot
--    { "thermalfoundation:material",       129, 1024, 256 }, -- Tin Ingot
--    { "thermalfoundation:material",       130, 1024, 256 }, -- Silver Ingot
--    { "thermalfoundation:material",       131, 1024, 256 }, -- Lead Ingot
--    { "thermalfoundation:material",       161, 1024, 256 }, -- Electrum Ingot
--    { "thermalfoundation:material",       162, 1024, 256 }, -- Invar Ingot
--    { "thermalfoundation:material",       163, 1024, 256 }, -- Bronze Ingot
--    { "thermalfoundation:material",       164, 1024, 256 }, -- Constantan Ingot
--    { "thermalfoundation:material",       165, 1024, 256 }, -- Signalum Ingot
--    { "thermalfoundation:material",       166, 1024, 256 }, -- Lumium Ingot
--    { "thermalfoundation:material",       167, 1024, 256 }, -- Enderium Ingot
--    { "appliedenergistics2:material",       24, 4096, 256 }, -- Engineering Processor
--    { "appliedenergistics2:material",       23, 4096, 256 }, -- Calculation Processor
--    { "appliedenergistics2:material",       22, 4096, 256 }, -- Logic Processor
--    { "appliedenergistics2:material",       11, 4096, 256 }, -- Pure Nether Quartz Crystal
--    { "appliedenergistics2:material",       10, 4096, 256 }, -- Pure Certus Quartz Crystal
--    { "appliedenergistics2:material",       7, 4096, 256 }, -- Fluix Crystal
--    { "appliedenergistics2:material",       12, 4096, 256 }, -- Pure Fluix Crystal
--    { "appliedenergistics2:material",       0, 4096, 256 }, -- Certus Quartz Crystal
--    { "appliedenergistics2:material",       1, 4096, 256 }, -- Charged Certus Quartz Crystal
--    { "appliedenergistics2:material",       8, 4096, 256 }, -- Fluix Dust
--    { "appliedenergistics2:material",       2, 4096, 256 }, -- Certus Quartz Dust
--    { "actuallyadditions:item_dust",       5, 4096, 256 }, -- Crushed Quartz
--    { "enderio:item_material",       5, 4096, 256 }, -- Silicon
--    { "enderio:item_alloy_ingot",       1, 1024, 256 }, -- Energetic Alloy Ingot
--    { "enderio:item_alloy_ingot",       2, 1024, 256 }, -- Vibrant Alloy Ingot
--    { "enderio:item_alloy_ingot",       5, 1024, 256 }, -- Pulsating Iron Ingot
--    { "enderio:item_alloy_ingot",       6, 1024, 256 }, -- Dark Steel Ingot
--    { "enderio:item_alloy_ingot",       7, 1024, 256 }, -- Soularium Ingot
--    { "enderio:item_alloy_ingot",       8, 1024, 256 }, -- End Steel Ingot
--    { "enderio:item_alloy_ingot",       0, 1024, 256 } -- Electrical Steel Ingot
}
 
loopDelay = 60 -- Seconds between runs
 
-- Init list with crafting status
for curIdx = 1, #items do
    items[curIdx][5] = false -- Crafting status set to false
    items[curIdx][6] = nil -- Crafting object null
end

local function loop()
  for curIdx = 1, #items do
    curName = items[curIdx][1]
    curDamage = items[curIdx][2]
    curMinValue = items[curIdx][3]
    curMaxRequest = items[curIdx][4]
    curCrafting = items[curIdx][5]
    curCraftStatus = items[curIdx][6]
 
    -- io.write("Checking for " .. curMinValue .. " of " .. curName .. "\n")
    storedItem = meController.getItemsInNetwork({
    name = curName,
    damage = curDamage
    })
    drawText("Network contains ",gpu2p)
    gpu2p.setForeground(0xCC24C0) -- Purple-ish
    drawText(storedItem[1].size,gpu2p)
    gpu2p.setForeground(0xFFFFFF) -- White
    drawText(" items with label ",gpu2p)
    gpu2p.setForeground(0x00FF00) -- Green
    drawText(storedItem[1].label .. "\n",gpu2p)
    gpu2p.setForeground(0xFFFFFF) -- White
    if storedItem[1].size < curMinValue then
      delta = curMinValue - storedItem[1].size
      craftAmount = delta
      if delta > curMaxRequest then
        craftAmount = curMaxRequest
      end
 
      drawText("  Need to craft ",gpu2p)
      gpu2p.setForeground(0xFF0000) -- Red
      drawText(delta,gpu2p)
      gpu2p.setForeground(0xFFFFFF) -- White
      drawText(", requesting ",gpu2p)
      gpu2p.setForeground(0xCC24C0) -- Purple-ish
      drawText(craftAmount .. "... ",gpu2p)
      gpu2p.setForeground(0xFFFFFF) -- White
 
      craftables = meController.getCraftables({
        name = curName,
        damage = curDamage
        })
      if craftables.n >= 1 then
        cItem = craftables[1]
        if curCrafting then
          if curCraftStatus.isCanceled() or curCraftStatus.isDone() then
            drawText("Previous Craft completed\n",gpu2p)
            items[curIdx][5] = false
            curCrafting = false
          end
        end
        if curCrafting then
          drawText("Previous Craft busy\n",gpu2p)
        end
        if not curCrafting then
          retval = cItem.request(craftAmount)
          items[curIdx][5] = true
          items[curIdx][6] = retval
          gpu2p.setForeground(0x00FF00) -- Green
          drawText("Requested - ",gpu2p)
          --while (not retval.isCanceled()) and (not retval.isDone()) do
          --      os.sleep(1)
          --        io.write(".")
          -- end
          gpu2p.setForeground(0xFFFFFF) -- White
          drawText("Done \n",gpu2p)
        end
      else
        gpu2p.setForeground(0xFF0000) -- Red
        drawText("    Unable to locate craftable for " .. storedItem[1].name .. "\n",gpu2p)
        gpu2p.setForeground(0xFFFFFF) -- White
      end
    end
  end
  drawText("Sleeping for " .. loopDelay .. " seconds...\n\n",gpu2p)
end

event.timer(loopDelay, loop, math.huge)

So what I did was removing your while loop, and just put the entire code inside that loop into a function called "loop". Then I set a timer with event.timer, that will wait "loopDelay" seconds until it calls the loop function. Since I added math.huge as third variable, the loop function will be called repeatedly.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use and Privacy Policy.