Пишу сетевой чат. При подключении клиента к серверу нужно запустить новый поток обработки сигналов сокета клиента, но в Qt слоты запускаются в том потоке, в котором был создан сигнал, насколько я понял. И пока в решении этой проблемы пока помогло только moveToThread(this).
в Qt слоты запускаются в том потоке, в котором был создан сигнал
Нет. Слот запускается в том потоке, к которому принадлежит объект в котором этот слот.
Когда ты создаешь QThread, он хоть и управляет отдельным потоком, тем не менее сам «принадлежит» основному потоку. Вот и получается, что все работает в одном потоке. Делая moveToThread(this) ты переносишь объект в поток, которым он сам и управляет. Теоретически так делать можно, по крайней мере в документации на Qt я не видел запрет этого. На практике так лучше не делать, а то мало ли оно что...
Короче, делаешь наследника от QObject, пихаешь в него что нужно, и делаешь myCoolObj->moveToThread(thread).
Сделал сейчас так. Получается, идет обработка в другом потоке, но теперь другая проблема: обработка происходит первого сигнала. Дальше хоть посылай, хоть отключайся - ничего не происходит.
QThread *thread = new QThread();
client_process *cl = new client_process(client);
cl->moveToThread(thread);
thread->start();
Правильно делаю?
Коннекты описываю в конструкторе client_process.
Когда вам не нужен цикл обработки событий в вашем потоке, следует создать потомка QThread. Если вам нужен цикл обработки событий и обработка сигналов и слотов внутри потока, наследоваться не стоит.
Ему нужен цикл обработки событий, эрго ему не нужно наследоваться, а нужно читать статью «you're doing it wrong».
О боги, на лоре сплошь одни хомячки, не способные не то, что думать самостоятельно, но и даже читать.
но в Qt слоты запускаются в том потоке, в котором был создан сигнал
В Qt (4.x + по крайней мере) по умолчанию слоты вызываются в контексте потока владеющего обьектом содержащим слот пруф.
Лучше сразу научиться пользоваться воркерами. Один поток на обработку сетевых событий и пул потоков на запросы клиентов.
Полностью поддерживаю, лучше сначала освоить тот же QtFuture, поиметь опыт работы с параллельными задачами, а потом уже разбираться как подобный функционал можно делать ручками, если желание(а точнее потребность) возникнет :)
P.S. если возникает необходимость в чем то типо moveToThread - то это в 90% проблема дизайна, а некоторые товарищи например считают что даже необходимость в локах признак плохого дизайна :)
Разделять же сокеты между потоками это изначально бэд идея, проще иметь одного воркера с интерфейсом типа: postMessage; getQueuedMessages, а обработку пришедших сообщений передавать потокам.
Так что на счет того, что обрабатывается только первый сигнал?(
Я уже переписал весь код с нуля.
Сделал отдельно класс сервера, и класс работы с клиентом.