Здравствуйте!
Смысл программы: чтобы пытаться соединиться по сокету в течении заданного времени (таймаута). Если сокет соединился — возвратить успех, а если не соединился в течении заданного времени (произошел таймаут) — то возвретить ошибку. Главный вопрос: как обойтись без вызова '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()' не был блокирующим.
Подскажите, пожадуйста, как написать код, и кде копать.