Вы меня нифига не понимаете, или имеете неверное представление о QSocket, который предоставляет асинхронный (
неблокирующий) доступ к сокету ОС.
При этом сам QSocket на ожидание пакетов приложение (GUI поток) тормозить не будет.
Т.е.
- Вызвали connectToHost() и убежали по делам (вернулись в главный цикл)
- По результату connectToHost через n-ое время нам прилетает сиглал error() или connected(). (в промежутке ещё и hostFound(), но он не так интересен )
Обрабатыаем сигнал, если connected(), то например, передаём данные с помощью writeBlock(), с обязательным контролем кода возврата и соответствующим "сдвигом передающего буфера". После вызова writeBlock() опять же вернулись в гл. цикл.
- По факту отправки некоторого числа байтиков (не обязательно всех) словили сигнал bytesWritten(nbytes), если надо, опять попытались чёнить послать и вернулись.
и .т.д.
- По приёму ловите сигнал readyRead(), спрашиваете сколько пришло bytesAvailable(), и читаете в буфер с помощью readBlock().
Между вызовами этих сигналов ваше GUI приложение вполне нормально живёт, без всяких тормозов.
Единственное что при этом надо реализовать так это машину состояний для вашего соединения.
ИМХО при грамотном проектировании многое можно сделать в одном потоке ничуть не менее производительнее нежели чем в нескольких. Много-ядерные/процессорные системы не в счёт.
P.S. Всё это на примере Qt3, на 4-ой оно ещё развесистей ( QAbstractSocket, QTcpSocket, QUdpSocket и т.д.)