Russian Qt Forum

Qt => Работа с сетью => Тема начата: garryHotDog от Май 25, 2010, 18:21



Название: QTcpSocket в Qthread, проблема "приема" сигнала connected() от сокета !!!!
Отправлено: garryHotDog от Май 25, 2010, 18:21
Задача:
   Необходимо сделать поток, который будет управлять определенным количеством сокетов...что бы не было блокировки использую соединение connectToHost() без waitForConnected(), когда придет сигнал connected() от сокета, я выставляю флаг в классе сокета, что соединение установлено и работаю с сокетом на чтение\отправку
Проблема
 после вызова connectToHost(), сокет проходит все состояние (hostlookup, connecting), но в состояние ConnectedState не приходит и сигнал connected() не приходит!? НО если после функции connectToHost() поставить waitForConnected() - сигнал connected() тут как тут!?...пол дня ломал голову так ничего и не решил проблему...привожу пример кода

конструктор сокета (соединяю сигналы и слоты)
Код
C++ (Qt)
CMyTcpSocket::CMyTcpSocket()
{
qRegisterMetaType<QAbstractSocket::SocketState>("QAbstractSocket::SocketState");
  connect(this,SIGNAL(stateChanged(QAbstractSocket::SocketState)),
       this,SLOT(slot_OnSocketChangeState(QAbstractSocket::SocketState)));
connect(this,SIGNAL(readyRead()), this, SLOT(slot_OnReadyRead()));
connect(this,SIGNAL(connected()), this, SLOT(slot_OnConnect()));
connect(this,SIGNAL(disconnected()), this, SLOT(slot_OnDisconnect()));
}
 

функция соединения
Код
C++ (Qt)
CMyTcpSocket::Connect()
{
connectToHost("192.168.205.137",6346);
}
 

- Инициализация потока управления сокетами.
Код
C++ (Qt)
bool CMyThread::Initialize()
{
CMyTcpSocket mysocket=new CMyTcpSocket;
mysocket->movetoThread(this);
}
 
- исполняемая функция потока run()
Код
C++ (Qt)
void CMyThread::run()
{
   while(m_mustStop)
{
// find our socket
....
....
....
mysocket->Connect();
}
}
 

после вызова Connect() сигнал connected() в сокет не приходит - в этом основная проблема (а если добавить waitForConnected все работает!?).....помоЖите чем моЖите....заранее спасибо за комменты!!! P.s. Асинхронный режим работы сокетов не подойдет (уже пробовал -  проц грузится под 100% при 1000 сокетах.)


Название: Re: QTcpSocket в Qthread, проблема "приема" сигнала connected() от сокета !!!!
Отправлено: kibsoft от Май 25, 2010, 18:49
waitForConnected() а чем тебе не нравится то?
Соединение же не мгновенно происходит..поэтому ты и должен немного подождать.
connectToHost("192.168.205.137",6346); выполнится за нано(наверное :)) секунды, а соединение может устанавливаться несколько секунд(зависит от связи)..


Название: Re: QTcpSocket в Qthread, проблема "приема" сигнала connected() от сокета !!!!
Отправлено: garryHotDog от Май 25, 2010, 18:53
Цитировать
waitForConnected() а чем тебе не нравится то?

 подключение сокетов будет происходить по очереди, поэтому если 1 сокет будет соединяться, то остальные будут ждать...произойдет блокировка!!


Название: Re: QTcpSocket в Qthread, проблема "приема" сигнала connected() от сокета !!!!
Отправлено: garryHotDog от Май 25, 2010, 20:01
если поставить в конце ф-ии run()  - exec(), то сигнал connected() приходит....но как мне тогда сделать потоковый опрос сокетов!?


Название: Re: QTcpSocket в Qthread, проблема "приема" сигнала connected() от сокета !!!!
Отправлено: kibsoft от Май 25, 2010, 23:09
Че за "потоковый опрос"? При exec() заработало, т.к. та запустил цикл событий.
Если что-то понял по твоему вопросу, то можешь хранить все сокеты в QList например и оттуда их "опрашивать".