Russian Qt Forum

Qt => Работа с сетью => Тема начата: Маус от Апрель 06, 2013, 08:41



Название: Не срабатывает слот incomingConnection() после переноса обмена в доп. поток
Отправлено: Маус от Апрель 06, 2013, 08:41
Взял пример реализации сервер-клиент на основе QTcpSocket и QTcpServer из документации, всё прекрасно работает, решил переместить обмен в доп. поток QThread. QTcpSocket прекрасно передает запросы, всегда приходит сигнал hostFound(), иногда даже приходит сигнал connected(), но на сервере не срабатывает слот incomingConnection(). Qt 4.6.0 WinXP+WinVista.


Название: Re: Не срабатывает слот incomingConnection() после переноса обмена в доп. поток
Отправлено: dio от Апрель 06, 2013, 10:24
Приведите пример кода, реализации сервера и клиента.


Название: Re: Не срабатывает слот incomingConnection() после переноса обмена в доп. поток
Отправлено: Маус от Апрель 07, 2013, 12:53
Мой код полностью соответствует документации, и он работал, пока его не засунули в доп. поток. Может кто-нибудь даст ссылку на работающий пример реализации клиент-сервер в доп. потоке?


Название: Re: Не срабатывает слот incomingConnection() после переноса обмена в доп. поток
Отправлено: Bepec от Апрель 07, 2013, 13:23
Отвечу вам...

Код полностью соответствующий документации должен работать в доп. потоке.

Покажите ваш код :)


Название: Re: Не срабатывает слот incomingConnection() после переноса обмена в доп. поток
Отправлено: Маус от Апрель 07, 2013, 19:18
Реализация Сервера (без .h файлов)
Код:
#include "server.h"
#include "ServerThread.h"

Server::Server(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
server = new CServerThread(this);
server->start();
}


#include "ServerThread.h"
#include "CServerTcp.h"

CServerThread::CServerThread(QObject *parent)
: QThread(parent)
{
moveToThread(this);
serverTcp = new CServerTcp(this);
}
void CServerThread::run()
{
if(!serverTcp->listen(QHostAddress::Any, 1204)) {
return;
}
while(1) {
sleep(2);
}
exec();
}



#include "CServerTcp.h"

CServerTcp::CServerTcp(QObject *parent)
: QTcpServer(parent)
{
}
void CServerTcp::incomingConnection(int socketId)
{
qDebug("New client connection!");
}

Реализация клиента
Код:
#include "client.h"
#include "ClientThread.h"

Client::Client(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
client = new CClientThread(this);
client->start();
}


#include "ClientThread.h"
#include "ClientTcp.h"

CClientThread::CClientThread(QObject *parent)
: QThread(parent)
{
moveToThread(this);
clientTcp = new CClientTcp(this);
}
void CClientThread::run()
{
clientTcp->connectToHost("192.168.0.1",1204);
if(!clientTcp->waitForConnected()) {
qDebug("connected faild");
return;
}
while(1) {
sleep(2);
}
exec();
}


Название: Re: Не срабатывает слот incomingConnection() после переноса обмена в доп. поток
Отправлено: Bepec от Апрель 07, 2013, 19:42
Насколько я помню доку, то вообще то желательно запускать в потоке цикл событий. А то сигналы и слоты не работают как бы.

PS попробуйте там слот сделать и вызвать его через сигнал QueuedConnection'ном.


Название: Re: Не срабатывает слот incomingConnection() после переноса обмена в доп. поток
Отправлено: Маус от Апрель 07, 2013, 20:29
нашел про цикл событий (на стороне клиента):
http://www.prog.org.ru/topic_21076_0.html (http://www.prog.org.ru/topic_21076_0.html)
но у меня в функции run() (и на сервере и у клиента) уже есть цикл по общему буферу с двумя семафорами. Как тогда объединить эти два бесконечных цикла?


Название: Re: Не срабатывает слот incomingConnection() после переноса обмена в доп. поток
Отправлено: Маус от Апрель 07, 2013, 20:52
QEventLoop помог.
IncomingConnection() наконец-то стал запускаться на сервере.
Теперь осталось скрестить ужа и ежа (зачеркнуто) два цикла, засуну ка я в цикл событий цикл по буферу с семафорами;-)


Название: Re: Не срабатывает слот incomingConnection() после переноса обмена в доп. поток
Отправлено: Bepec от Апрель 08, 2013, 15:45
Событийный поток сделайте.

Аля
Код:
void run()
{
    //чё то делаете, соединяете слоты и прочая
    exec(); // запускаете цикл событий потока :D
}