Here is the situation:
- You have one long-running calculation running in a background thread.
- This calculation is sending out a signal to, for example, refresh a GUI element, every 100 msec.
- Let’s say it sends out 100 such signals.
- The widget being redrawn takes more than 100 msec to redraw; let’s say 1 second.
What happens in the event loop? Do the signal calls “pile up” until they are all executed (i.e. 100 seconds)? Is there any mechanism for “dropping” events?
User events are never discarded. If you queue emitted signal events faster than you can process them, your event queue will grow until you run out of memory and your program will crash. It’s worth noting, though, that QTimer will skip timeout events if the system is under heavy load. To some extent, that may help regulate your throughput.
You could also consider sending feedback from one thread to the other (an acknowledgement, perhaps), and manually adjust your timing in the producer thread based on how far behind the consumer thread is. Or, you could use a metaphorical sledgehammer and switch to a blocking queued connection.