Доброго времени суток. Есть слот, связанный с сигналом:
connect(clientSocket, SIGNAL(readyRead()),
this, SLOT(slotReadClient())); // при поступлении запросов от клиентов
void ServerSocket::slotReadClient()
{
QTcpSocket* clientSocket = (QTcpSocket*)sender();
QDataStream in(clientSocket);
in.setVersion(QDataStream::Qt_4_5);
for (;;)
{
if (!m_nNextBlockSize)
{
if (clientSocket->bytesAvailable() < sizeof(quint16))
break;
in >> m_nNextBlockSize;
}
if (clientSocket->bytesAvailable() < m_nNextBlockSize)
break;
QTime time;
QString str="";
in >> time >> str;
QByteArray ba = str.toLatin1(); // переводим QString
char *str2 = ba.data(); // в char
m_nNextBlockSize=0;
strcat(str2, "\r");
temp_com->writeToPort(str2);
sendToClient(clientSocket, temp_com->getQba());
}
}
И так. Объясняю, в чем смысл. На серверный сокет приходит из другого приложения команда. Естественно, при приходе этой команды вызывается слот slotReadClient(). В нем происходит прием команды, далее к команде добавляется "\r" и она передается оборудованию, который висит на COM-порту (с помощью метода temp_com->writeToPort(...)).
Когда COM-порт получает эту команду, он передает ее оборудованию, и оно отвечает также на COM-порт. Необходимо этот ответ словить и выдать обратно на сокет clientSocket, чтобы приложение, которое послало команду, получило ответ.
Естественно, сразу после строчки
temp_com->writeToPort(str2);
писать следующее:
sendToClient(clientSocket, temp_com->getQba());
нельзя, так как COM-порт еще не успеет выполнить всю свою работу, и получится, что я отправлю по сокету пустой ответ. (Но по крайней этот код выполняется без ошибок, просто не делает то, что мне надо)
Поэтому я сделал решил попробовать сделать так:
void ServerSocket::slotReadClient()
{
// код без изменений
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), SLOT(slotSendToClient()));
temp_com->writeToPort(str2);
timer->start(2000);
}
}
И в слоте slotSendToClient()
void ServerSocket::slotSendToClient()
{
timer->stop();
delete timer;
sendToClient(clientSocket, temp_com->getQba());
}
Т.е. идея ясна: сделать небольшую задержку, которая позволит отработать COM-порту, и только потом выслать ответ на сокет (это по сути должно обеспечить то, что ответ будет не пустой).
НО! При вызове
sendToClient(clientSocket, temp_com->getQba());
внутри слота
возникает необработанное исключение. Я понял, что именно из-за этой строчки когда закомментировал ее и исключения не получил. try catch на этой строчке исключение не ловит (да и вообще, NOKIA вроде как не рекомендует использовать исключения в QT). Еще раз повторюсь, что исключения не происходит, если вызывать sendToClient не из слота slotSendToClient. В чем причина такого поведения?...