QTcpServer - как многопоточность - пример плохой

Я пытаюсь заставить QTcpServer запускать отдельный поток для каждого соединения. Доступен пример кода, который делает именно это: http://doc.qt.io/qt-5/qtnetwork-threadedfortuneserver-example.html

Этот код работает путем подкласса QThread. Если я создам свой код на основе этого примера, я довольно скоро столкнусь с «QObject: невозможно создать дочерние элементы для родителя, который находится в другом потоке». предупреждения.

Существует документация Qt, в которой не рекомендуется создавать подклассы QThread, поскольку это «делает это неправильно»: http://blog.qt.io/blog/2010/06/17/youre-doing-it-wrong/

Итак, мой вопрос: если предоставленный Qt пример кода прямо нарушает рекомендуемую практику Qt, есть ли пример правильного способа сделать это? Любой пример, который я нашел до сих пор, является подклассом QThread.


person Philipp    schedule 16.03.2015    source источник
comment
я не вижу причин перемещать объект QTcpServer в другой поток. реализовано, что он запускает свое соединение сзади и излучает сигналы, когда что-то происходит. пример кода можно найти по адресу doc.qt.io/qt-5/qthread.html , поэтому если сервер работает в основном потоке, а его «рабочий процесс» обрабатывает события в фоновом режиме, он также должен выполнять свою работу.   -  person Zaiborg    schedule 17.03.2015
comment
это именно то, что я пытаюсь сделать. Часть принятия происходит в основном цикле событий и, следовательно, в основном потоке. Как только соединение установлено, ввод-вывод TCP в соответствующем сокете должен происходить в его собственном потоке.   -  person Philipp    schedule 17.03.2015
comment
Можете ли вы показать нам, как на самом деле выглядит ваш код?   -  person Zaiborg    schedule 17.03.2015


Ответы (1)


Qt является развивающимся продуктом. И, кажется, сабклассирование QThread до сих пор считается юридической практикой. Это просто более старый метод, поэтому старые примеры используют его.

Ваша проблема, по-видимому, заключается в неправильном использовании QObject (ов) в разных потоках, а не в подклассах QThread. Сначала попробуйте найти код, который выдает предупреждения.

person Matt    schedule 17.03.2015