QTcpServer не получает никаких данных при работе в QRunnable
У меня странная проблема в типичном сценарии: метод входящего соединения QTcpServer переопределяется в пользовательском классе, и любое полученное соединение планируется обрабатывать в отдельном потоке в QThreadPool.
Сервер:
void FooS::incomingConnection(qintptr socketDescriptor)
{
QThreadPool *thread_pool = QThreadPool::globalInstance();
FooSocket *fs = new FooSocket();
fs->setSocket(socketDescriptor);
thread_pool->start(fs);
}
Задача:
class FooSocket: public QObject, public QRunnable;
...
private slots:
void connectionIncomingData();
...
void FooSocket::run() {
QTcpSocket *socket = new QTcpSocket();
qDebug() << "SD: " << socketDescriptor; // is correct
if (!socket->setSocketDescriptor(socketDescriptor)) {
qDebug() << "Can't set socket descriptor";
emit error(socket->error());
return;
}
// -- had no effect here
// socket->moveToThread(QThread::currentThread());
connect(socket, SIGNAL(readyRead()), this, SLOT(connectionIncomingData()));
connect(socket, SIGNAL(disconnected()), this, SLOT(connectionClosed()));
}
Сигнал readyRead не запускается, но подтверждается клиент сокета (tcpdump) для отправки данных.
После создания QRunnable для порождения объекта QThread с логикой сокетов внутри и игры с setAutoDelete, moveToThread - по-прежнему безрезультатно.
1 ответ
Решение
Для обработки событий в QRunnable
поток должен иметь свой собственный цикл обработки событий, он не должен полагаться на один из основного потока. Из того, что вы показали в своем коде, ваш поток быстро запускается, а затем завершается без выполнения цикла.
Попробуйте добавить
QEventLoop loop;
// connect a signal to the event loop's quit() slot
loop.exec();