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();
Другие вопросы по тегам