Я создаю маленький многопоточный веб-сервер. QTcpSockets выбираются в основном потоке и затем передают QtConcurrent QThreadPool, который в конечном счете обрабатывает данные и отсылает ответ.
Моя проблема состоит в том, что сокет создается в основном потоке и обрабатывается в другом. Это вызывает ошибки при попытке записать в сокет:
socket->write(somedata);
QObject: не Может создать детей для родителя, который находится в другом потоке. (Родителем является QNativeSocketEngine (0x608330), поток родителя является QThread (0x600630), текущий поток является QThread (0x505f60)
Очевидный способ должен был бы переместить объект сокета в использование потока обработки
socket->moveToThread(QThread::currentThread()).
Это, однако, можно только назвать в потоке, в котором был создан объект. Кроме того, сокет сделал, чтобы QTcpServer возразил как родитель, таким образом, moveToThread () перестанет работать так или иначе (порожденные объекты не могут переключить потоки).
Как может я перемещать объект в QThread:: currentThread () в рамках кода, который выполняется пулом потоков? С другой стороны, как я могу записать в сокет вне потока, он был создан?
Расширить QTcpServer
, переопределить incomingConnection (int socketDescriptor)
и передать дескриптор сокета потокам в пуле. Попросите QRunnable
создать QTcpSocket
из дескриптора и запустить цикл обработки событий для приема сигналов этого сокета.
Брэдли Хьюз написал в Qt Labs сообщение на эту тему, возможно, это вам немного поможет!