Many thanks for the explanation - that helps quite a bit.
On a related note are there ever any timing problems with calling methods with the @mainthread (or Clock.schedule_once) operations?
The reason I am asking is that I have found that if I call a method A with the @mainthread decorator before starting a Python thread, then call another @mainthread decorated method B once within the Python thread after it has been started then, on a rare occasion, method B is run before method A even though the calling order is in the opposite.
Is the scheduling on the Kivy UI thread guaranteed to force these to be in sequential order as one would expect in the code or could there be a sort of race condition where method B is scheduled before method A? If I put enough of a time.sleep() at the start of the Python thread before the call to method B then these calls are separated enough in time that it is not a problem but this seems a bit hacky to me.
Would you happen to know if I were to use Clock.schedule_once with the argument to force to the call to method A to be operated before the next frame and then method B called to operate in the next frame (w/ -1 and 0 respectively) then would this force the order to be as expected? Or could it be ensured by using the max_iteration property?