Russian Qt Forum
Ноябрь 05, 2024, 22:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTcpSocket в Qthread, проблема "приема" сигнала connected() от сокета !!!!  (Прочитано 5391 раз)
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 сокетах.)
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #1 : Май 25, 2010, 18:49 »

waitForConnected() а чем тебе не нравится то?
Соединение же не мгновенно происходит..поэтому ты и должен немного подождать.
connectToHost("192.168.205.137",6346); выполнится за нано(наверное Улыбающийся) секунды, а соединение может устанавливаться несколько секунд(зависит от связи)..
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
garryHotDog
Гость
« Ответ #2 : Май 25, 2010, 18:53 »

Цитировать
waitForConnected() а чем тебе не нравится то?

 подключение сокетов будет происходить по очереди, поэтому если 1 сокет будет соединяться, то остальные будут ждать...произойдет блокировка!!
Записан
garryHotDog
Гость
« Ответ #3 : Май 25, 2010, 20:01 »

если поставить в конце ф-ии run()  - exec(), то сигнал connected() приходит....но как мне тогда сделать потоковый опрос сокетов!?
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #4 : Май 25, 2010, 23:09 »

Че за "потоковый опрос"? При exec() заработало, т.к. та запустил цикл событий.
Если что-то понял по твоему вопросу, то можешь хранить все сокеты в QList например и оттуда их "опрашивать".
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.13 секунд. Запросов: 23.