Python API Docs: Examples for new timer api

This commit is contained in:
Jacques Lucke 2018-11-27 11:31:35 +01:00
parent 39dcf6a10a
commit dcb86689b0
Notes: blender-bot 2023-02-14 05:53:38 +01:00
Referenced by issue #59907, strange slowness in subsurf + armature deform (blender 2.80)
5 changed files with 75 additions and 0 deletions

View File

@ -0,0 +1,10 @@
"""
Run a Function in x Seconds
---------------------------
"""
import bpy
def in_5_seconds():
print("Hello World")
bpy.app.timers.register(in_5_seconds, first_interval=5)

View File

@ -0,0 +1,11 @@
"""
Run a Function every x Seconds
------------------------------
"""
import bpy
def every_2_seconds():
print("Hello World")
return 2
bpy.app.timers.register(every_2_seconds)

View File

@ -0,0 +1,17 @@
"""
Run a Function n times every x seconds
--------------------------------------
"""
import bpy
counter = 0
def run_10_times():
global counter
counter += 1
print(counter)
if counter == 10:
return None
return 0.1
bpy.app.timers.register(run_10_times)

View File

@ -0,0 +1,12 @@
"""
Assign parameters to functions
------------------------------
"""
import bpy
import functools
def print_message(message):
print("Message:", message)
bpy.app.timers.register(functools.partial(print_message, "Hello"), first_interval=2)
bpy.app.timers.register(functools.partial(print_message, "World"), first_interval=3)

View File

@ -0,0 +1,25 @@
"""
Use a Timer to react to events in another thread
------------------------------------------------
You should never modify Blender data at arbitrary points in time in separate threads.
However you can use a queue to collect all the actions that should be executed when Blender is in the right state again.
Pythons `queue.Queue` can be used here, because it implements the required locking semantics.
"""
import bpy
import queue
execution_queue = queue.Queue()
# This function can savely be called in another thread.
# The function will be executed when the timer runs the next time.
def run_in_main_thread(function):
execution_queue.put(function)
def execute_queued_functions():
while not execution_queue.empty():
function = execution_queue.get()
function()
return 1
bpy.app.timers.register(execute_queued_functions)