Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Design Strategy
#6
You might find some code useful.
example
from enum import Enum

Status = Enum("Status", "waiting, init, running, completed")

class Task:
    queue = []
    running = 0

    def __init__(self, task, status):
        self.var = task
        self.status = status

    def routine(self):
        if self.status in (Status.init, Status.running):
            self.status = self.var.routine(self.status)

    @classmethod
    def add(cls, task, status=Status.waiting):
        cls.queue.append(cls(task, status))

    @classmethod
    def empty(cls):
        return len(cls.queue) == 0

    @classmethod
    def routines(cls):
        print("\nTask List")
        new_queue = []
        cls.running = 0
        for q in cls.queue:
            print("\n  name:", q.var.name)
            print("  - status:", q.status, "\n")
            q.routine()

            if q.status in (Status.init, Status.running):
                cls.running += 1

            if q.status != Status.completed:
                new_queue.append(q)

        cls.queue = new_queue
        if cls.running == 0:
            if len(cls.queue) > 0:
                cls.queue[0].status = Status.init

class AutoPilot:

    def __init__(self):
        pass

    @classmethod
    def turn(cls, target_angle, current_angle):
        obj = cls()
        obj.name = "Turn"
        obj.target_angle = target_angle
        obj.current_angle = current_angle
        obj.routine = obj.turn_craft_oaf
        return obj

    @classmethod
    def stationary(cls):
        obj = cls()
        obj.name = "Stationary"
        obj.routine = obj.stationary_position
        return obj

    def turn_craft_oaf(self, status):
        print("Routine 'turn_craft_oaf' called")
        return Status.completed

    def stationary_position(self, status):
        print("Routine 'stationary' called")
        if status == Status.init:
            print("Routine 'stationary' init")
            self.center = 0
            return Status.running
        else:
            self.center += 1
            if(self.center >= 2):
                print("Routine 'stationary' completed")
                return Status.completed

        return status

def main():
    Task.add(AutoPilot.turn(90, 10), Status.init)
    Task.add(AutoPilot.stationary())

    while not Task.empty():
        Task.routines()

main()

another example.
from enum import Enum

Status = Enum("Status", "waiting, init, running, completed")

class Task:
    queue = []
    running = 0

    def __init__(self, task, status):
        self.task = task
        self.status = status

    def routine(self):
        if self.status in (Status.init, Status.running):
            self.task.routine(self)

    @classmethod
    def add(cls, task, status=Status.waiting):
        cls.queue.append(cls(task, status))

    @classmethod
    def empty(cls):
        return len(cls.queue) == 0

    @classmethod
    def routines(cls):
        print("\nTask List")
        new_queue = []
        cls.running = 0 
        for q in cls.queue:
            print("\n  name:", q.task.name)
            print("  - status:", q.status, "\n")
            q.routine()

            if q.status in (Status.init, Status.running):
                cls.running += 1

            if q.status != Status.completed:
                new_queue.append(q)

        cls.queue = new_queue
        if cls.running == 0:
            if len(cls.queue) > 0:
                cls.queue[0].status = Status.init

class AutoPilot:

    def __init__(self, name, routine):
        self.name = name
        self.routine = routine

    @classmethod
    def turn_task(cls, target_angle, current_angle):
        obj = cls("Turn", cls.turn_craft_oaf)
        obj.target_angle = target_angle
        obj.current_angle = current_angle
        return obj

    @classmethod
    def stationary_task(cls):
        obj = cls("Stationary", cls.stationary_position)
        return obj

    @staticmethod
    def turn_craft_oaf(obj):
        print("Routine 'turn_craft_oaf' called")
        obj.status = Status.completed

    @staticmethod
    def stationary_position(obj):
        print("Routine 'stationary_position' called")
        if obj.status == Status.init:
            print("Routine 'stationary_position' init")
            obj.task.center = 0
            obj.status = Status.running
        else:
            obj.task.center += 1
            if(obj.task.center >= 2):
                print("Routine 'stationary_position' completed")
                obj.status = Status.completed

def main():
    Task.add(AutoPilot.turn_task(90, 10), Status.init)
    Task.add(AutoPilot.stationary_task())

    while not Task.empty():
        Task.routines()

main()
99 percent of computer problems exists between chair and keyboard.
Reply


Messages In This Thread
Design Strategy - by microphone_head - Jul-23-2018, 12:57 AM
RE: Design Strategy - by Windspar - Jul-24-2018, 12:42 PM
RE: Design Strategy - by microphone_head - Jul-24-2018, 09:24 PM
RE: Design Strategy - by Windspar - Jul-24-2018, 10:15 PM
RE: Design Strategy - by microphone_head - Jul-27-2018, 09:16 PM
RE: Design Strategy - by Windspar - Jul-28-2018, 02:19 PM
RE: Design Strategy - by microphone_head - Jul-28-2018, 09:19 PM
RE: Design Strategy - by Windspar - Jul-28-2018, 10:15 PM
RE: Design Strategy - by microphone_head - Jul-28-2018, 10:33 PM
RE: Design Strategy - by microphone_head - Aug-01-2018, 08:30 PM

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020