Async / Non-blocking. It gets performed when GUI thread goes idle after processing messages (if any).
Callback queue itself is MT protected.
Also, callback gets invoked by GUI thread - it is in fact the best way how worker thread is supposed to communicate with it, means you do not need to worry too much about protecting data, there can only be a single GUI thread, means now two Callbacks from Callback (timer) queue can be processed at the same time.
And yes, to pass 10 parameters, put them into struct and use callback1.