LINUX.ORG.RU

QTcpSocket


0

0

Вопрос в том как закрыть его из другого потока. При вызове sckt.close(); из левого потока получается ошибочка...

ну если переменная sckt - глобальная, то должно закрыть. Или же если эта переменная "пришла" в поток как параметр, то тоже закроет... 

И вообще, какая ошибочка? Они как бы разные бывают...

fabregas
()
Ответ на: комментарий от fabregas

Есть класс какой-то в котором:

protected:
QTcpSocket sckt;

Одна из функций класса:

void MyClass::SocketRoutine(){
sckt.connectToHost("localhost",3421);
while(1){
тут читаем данные. Запущено в отдельном потоке.
}
}

void MyClass::Stop(){
sckt.close();
}

Вот т.к. SocketRoutine() и Stop() в разных потоках вызываются и я предполагаю что в цикле сразу после вызова close() будет выход т.к. соединение будет оборванно (по аналогии я также делал с обычными синхронными сокетами в виндовс и линукс, то есть я в цикле жду данных, в другом потоке вызываю close(), recv возвращает -1 и я выхожу из цикла.) Этот вариант в моей реализации ОЧЕНЬ желателен, по своим причинам.

Belevern
() автор топика
Ответ на: комментарий от Belevern

Забыл сказать какая ошибка. В винде в дебажной сборке асерт вызывается: Can't send event from another therad. То есть хотелось бы что-нибуть потоко безопасное достать.

Belevern
() автор топика

Создать слот, в котором закрывается сокет. А потом слать сигнал.

smh ★★★
()

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

fabregas
()
Ответ на: комментарий от Belevern

> то есть я в цикле жду данных, в другом потоке вызываю close(), recv возвращает -1 и я выхожу из цикла.

Вместо close() попробуй abort() тогда.

smh ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.