Skip to content
Snippets Groups Projects
tasks_queue.py 2.37 KiB
Newer Older
  • Learn to ignore specific revisions
  • # ##### BEGIN GPL LICENSE BLOCK #####
    #
    #  This program is free software; you can redistribute it and/or
    #  modify it under the terms of the GNU General Public License
    #  as published by the Free Software Foundation; either version 2
    #  of the License, or (at your option) any later version.
    #
    #  This program is distributed in the hope that it will be useful,
    #  but WITHOUT ANY WARRANTY; without even the implied warranty of
    #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    #  GNU General Public License for more details.
    #
    #  You should have received a copy of the GNU General Public License
    #  along with this program; if not, write to the Free Software Foundation,
    #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
    #
    # ##### END GPL LICENSE BLOCK #####
    
    if "bpy" in locals():
        from importlib import reload
    
        utils = reload(utils)
    else:
        from blenderkit import utils
    
    
    from bpy.app.handlers import persistent
    
    @persistent
    def scene_load(context):
    
        if not (bpy.app.timers.is_registered(queue_worker)):
    
            bpy.app.timers.register(queue_worker)
    
    
    Vilem Duha's avatar
    Vilem Duha committed
    def get_queue():
    
        # we pick just a random one of blender types, to try to get a persistent queue
        t = bpy.types.Scene
    
        if not hasattr(t, 'task_queue'):
            t.task_queue = queue.Queue()
        return t.task_queue
    
    Vilem Duha's avatar
    Vilem Duha committed
    
    
    class task_object:
        def __init__(self, command = '', arguments = (), wait = 0):
            self.command = command
            self.arguments = arguments
            self.wait = wait
    
    
    Vilem Duha's avatar
    Vilem Duha committed
    
    
    def add_task(task, wait = 0):
    
    Vilem Duha's avatar
    Vilem Duha committed
        q = get_queue()
    
        taskob = task_object(task[0],task[1], wait = wait)
        q.put(taskob)
    
    def queue_worker():
    
    Vilem Duha's avatar
    Vilem Duha committed
        q = get_queue()
    
    
        back_to_queue = [] #delayed events
    
    Vilem Duha's avatar
    Vilem Duha committed
        while not q.empty():
    
            # print('window manager', bpy.context.window_manager)
    
    Vilem Duha's avatar
    Vilem Duha committed
            task = q.get()
    
    
            if task.wait>0:
                task.wait-=time_step
                back_to_queue.append(task)
            else:
                utils.p('as a task:   ')
                utils.p(task.command, task.arguments)
                try:
                    task.command(*task.arguments)
                except Exception as e:
                    utils.p('task failed:')
                    print(e)
        for task in back_to_queue:
            q.put(task)
    
    Vilem Duha's avatar
    Vilem Duha committed
    
    
        bpy.app.handlers.load_post.append(scene_load)
    
    
        bpy.app.handlers.load_post.remove(scene_load)