2015-07-27 3 views
0

У меня проблема с синхронизацией (запуск в то же время QTCPSocket) в моем приложении у меня есть 10 сокетов. Я должен прочитать данные в одно и то же время для всех сокетов. На данный момент у меня есть кое-что:QTCPSocket запуск по таймеру в то же время

///.../// 
if(!socket->waitForConnected(-1)) 
{ 
    qDebug() << "Server not found"; 
    emit serverNotFound(); 

}else if(socket->state()==QAbstractSocket::ConnectedState){ 
     qDebug() << "Connected" 
     connect(timer, SIGNAL(timeout()),this,SLOT(connected())); 
     timer->start(1000);              
    } 
} 

На объединенном сигнале:

void SocketsClass::connected() 
{ 
    sendRequest(socket, messageToServer); 
} 

Проблема в том, что, когда первый сокет подключиться таймер запускается в один.

ответ

1

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

И, наконец, вы никогда не должны использовать методы Qt waitForXxx, они приводят к ужасному псевдосинхронному коду, который очень подвержен ошибкам, и его трудно расширить и поддерживать. Вместо этого используйте механизм сигнального слота.

Пример:

SocketManager : public QObject { 
    Q_OBJECT 
    QTcpSocket m_sockets[10]; 
    QTimer m_timer; 
public: 
    SocketManager(QObject * parent = 0) : QObject(parent) { 
    ... // connect all sockets here 
    m_timer.start(1000); 
    connect(&m_timer, &QTimer::timeout, [this]{ 
     for (auto & socket : m_sockets) 
     if (socket.state() == QAbstractSocket::ConnectedState) 
      sendRequest(socket, messageToServer); 
    }); 
    } 
}; 
+0

Это работает так, как я хотел. Вторая проблема заключается в том, что я хочу вставить значение с сервера в QTableWidget, и я не знаю, когда addRow для QTableWidget, потому что в этом случае я не знаю, какой сокет отвечает первым. – Szymson

+0

@Szymson Возможно, тогда вы должны задать другой вопрос. –

 Смежные вопросы

  • Нет связанных вопросов^_^