Привет. Столкнулся со следующей проблемой:
В GUI-треде срабатывает action, по которому нужно послать с помощью сокета сообщение удаленной машине, сообщение посылается (т.е write возвращает правильный размер), но не читается на обратном конце.
Стал разбираться, выяснилось следующее, если после срабатывания action'a управление передается на слот и в нем же происходит отправка данных на сервер, то все хорошо, все работает. Если же управление приходит на слот, но отправка непосредственно происходит в других ф-ях (слотах также), то сокет остается пустым.
Детальнее,
Запись в сокет:
void postman :: sendMessageToServer (QByteArray & darr)
{
QTcpSocket *sock ;
try
{
sock = new QTcpSocket;
if (!sock) throw tr("Ошибка выделения памяти");
sock->connectToHost(_ip, _port);
if (!sock->waitForConnected(1000)) throw tr ("Сервер не доступен");
int i = sock->write (darr);
if ( i == -1 ) throw QObject :: tr("Проблема связи с сервером") ;
sock-> deleteLater();
}
catch (QString s) {delete sock; emit errorHappens(s);}
}
если приходит сигнал соответствующий и управление передается на
void Arm :: sendRulesToOne (QString data)
{
/*Идет создание правильного сообщения по вводимым данным, не думаю, что это важно, управление остается в этой ф-ии*/
bool f = sendMessageToServer (a);
/*Идет проверка на значение f*/
}
то все хорошо.
Теперь, другая ситуация, когда управление переходит на
void Arm :: sendRulesToGroup (QString data, QList<QString> aList)
{
QString _lastAgent = currentEditAgent;
for (int i = 0 ; i < aList.size(); i++)
{
currentEditAgent = aList[i];
sendRulesToOne(data);
}
currentEditAgent = _lastAgent;
}
возникает описанная проблема.
Далее, создал контекстное меню, при срабатывании action'ов опять посылаются сообщения удаленной машине.
Заметил, что работают исключительно функции-слоты, в которых непосредственно осуществляется запись.
Подскажите, пожалуйста, что я неправильно делаю.