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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ожидание установки соединения сокета.  (Прочитано 3087 раз)
Yegor
Гость
« : Сентябрь 24, 2011, 14:51 »

Здравствуйте!
Смысл программы: чтобы пытаться соединиться по сокету в течении заданного времени (таймаута).  Если сокет соединился — возвратить успех, а если не соединился в течении заданного времени (произошел таймаут) — то возвретить ошибку. Главный вопрос: как обойтись без вызова 'qApp->processEvents()' внутри программы.

Исходный код:

Код:
//Конструктор.
McDaemon_Server::McDaemon_Server()
{
//Инициализация объектов.
m_pTryToConnect_timer = new QTimer(this);//Connection timer.
m_pOutputSocket = new QTcpSocket(this); //Client socket.

//Соединения.
//Сокет.
connect(m_pMySocket, SIGNAL(connected()), this, SLOT(on_Client_Connection_Has_Opened_slot()), Qt::QueuedConnection);
//Таймер.
connect(m_pTryToConnect_timer, SIGNAL(timeout()), this, SLOT(on_ConnectionTimeout_slot()), Qt::QueuedConnection);

}

//Slot - client connection has opened.
void McDaemon_Server::on_Client_Connection_Has_Opened_slot()
{
        m_pMySocket->flush();
        m_ClientConnectionStatus = 1;//Set flags, that connection is opened.
}

//Slot - When connection timeout occurs.
void McDaemon_Server::on_ConnectionTimeout_slot()
{
        m_pTryToConnect_timer->stop();
        m_IsConnectionTimeout = TRUE;
}

//*********************************************************************************************************************
//Главный метод — попытка установки соединения.
//Возвращает: TRUE – соединение произошло успешно, FALSE – соединение не произошло.
bool McDaemon_Server::createClientConnection()
{
//Начало попытки соединения.
m_pMySocket->connectToHost(strIp, port);

//Таймер ожидания соединения.
m_pTryToConnect_timer->start(10000); //10 секунд.

//Сбросить флаг.
m_ClientConnectionStatus = 0;

//Ожидание соединения.
//Этот цикл прекратится если установится соединение, или произойдет таймаут ожидания соединения (10 секунд).
//В нем вызывается 'qApp->processEvents()'.
while((m_ClientConnectionStatus != 1) && (!m_IsConnectionTimeout))
{
//Do delay.
#ifdef Q_WS_WIN
Sleep(ROUTINE_TIMER/1000); //In miliseconds.
#else
usleep(ROUTINE_TIMER); //In microseconds.
#endif
               
[b]qApp->processEvents(); //!!![/b]
}

//Проверка успешности соединения.
if(m_ClientConnectionStatus == 1)
return TRUE;
else
return FALSE;
}

Главный вопрос: как обойтись без 'qApp->processEvents()'?
Так как вызов 'qApp->processEvents()' порождает много нежелательных явлений.
И чтобы при этом метод 'McDaemon_Server::createClientConnection()' не был блокирующим.
Подскажите, пожадуйста, как написать код, и кде копать.
Записан
BRE
Гость
« Ответ #1 : Сентябрь 24, 2011, 15:20 »

Так как вызов 'qApp->processEvents()' порождает много нежелательных явлений.
Какие это явления?

У сокета есть такой метод, который делает ровно то, что ты пытаешься сделать, называется
bool QAbstractSocket::waitForConnected ( int msecs = 30000 )

P.S. Но внутри он все равно будет крутить цикла обработки событий.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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