Ok, three things.

1. I wouldn't transmit a QHash object across signals/slots between threads because at least one of two reasons - thread safety (two threads accessing a single object at the same time) or performance (serializing and deserializing the hash). Maybe you should have a single shared buffer (it can be a QHash object) protected with a mutex where you store values and signal the other thread they are ready.

2. Your thread objects probably live in the main thread so all signals emitted by them and all slots they contain are executed in the context of the main thread and not your "worker" threads which is probably not what you want. You should use QObject::moveToThread() to push those objects to their respective threads.

3. When you do what I said in the previous point, you will probably notice your slots are not executed at all. That's because a thread needs an event loop running to be able to execute slots across threads so you need to change your approach to an event driven one at least in the thread you want to process signals from other threads. It shouldn't be too hard in your case - just call exec() from run() and use timers with appropriate timeouts (like 12ms and 0 or more) to do your work.