Как сделать QObject:: moveToThread () при использовании QThreadPool?

Я создаю маленький многопоточный веб-сервер. QTcpSockets выбираются в основном потоке и затем передают QtConcurrent QThreadPool, который в конечном счете обрабатывает данные и отсылает ответ.

Моя проблема состоит в том, что сокет создается в основном потоке и обрабатывается в другом. Это вызывает ошибки при попытке записать в сокет:

socket->write(somedata);

QObject: не Может создать детей для родителя, который находится в другом потоке. (Родителем является QNativeSocketEngine (0x608330), поток родителя является QThread (0x600630), текущий поток является QThread (0x505f60)

Очевидный способ должен был бы переместить объект сокета в использование потока обработки

socket->moveToThread(QThread::currentThread()).

Это, однако, можно только назвать в потоке, в котором был создан объект. Кроме того, сокет сделал, чтобы QTcpServer возразил как родитель, таким образом, moveToThread () перестанет работать так или иначе (порожденные объекты не могут переключить потоки).

Как может я перемещать объект в QThread:: currentThread () в рамках кода, который выполняется пулом потоков? С другой стороны, как я могу записать в сокет вне потока, он был создан?

7
задан grefab 27 June 2010 в 02:29
поделиться

2 ответа

Расширить QTcpServer , переопределить incomingConnection (int socketDescriptor) и передать дескриптор сокета потокам в пуле. Попросите QRunnable создать QTcpSocket из дескриптора и запустить цикл обработки событий для приема сигналов этого сокета.

4
ответ дан 7 December 2019 в 14:28
поделиться

Брэдли Хьюз написал в Qt Labs сообщение на эту тему, возможно, это вам немного поможет!

http://blog.qt.digia.com/2010/06/17/youre-doing-it-wrong/

0
ответ дан 7 December 2019 в 14:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: