The whole point of creating separate threads for each port is to make them asynchronous relative to each other. Seems that this is not what you want. Thus you should handle all three ports in a single thread (which is what you should be doing anyway). Signals such as readyRead() are emitted when there is anything to be read on the port so you can connect to those and do the reading from all the ports in the main thread.