Russian Qt Forum
Ноябрь 22, 2024, 23:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: передача указателя на сокет в поток  (Прочитано 5004 раз)
Mark_T
Гость
« : Май 26, 2011, 12:48 »

Всем мое здравствуйте! Задача у меня такая.  Есть основной поток в котором создается сокет QTcpSocket и поток Thread
Код:
class Thread:public QThread
{
private:
  QString adr;
  QTcpSocket* socket;
public:
void setSocket(QTcpSocket* sPtr){
   socket=sPtr;
}
void setAdr(QString str){
  adr=str;
}
void run(){
  socket->connectToHost(adr,23);
  exec();
}
};
по нажатию кнопки передаю указатель потоку mThread класса Thread.
Код:
mThread.setSocket(tcpSocket);
mThread.setAdr(adrlineEdit->text());
mThread.start();
В основном потоке коннектятся сигналы tcpSocket. Так вот проблема в том, что сигнал коннекта проходит, а сигнал ошибок не проходит
Код:
   connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(slotError(QAbstractSocket::SocketError)));
А также в том, что при дисконекте и повторном нажатии на кнопку коннект не инициализируется.
Многопоточное приложение пишу впервые, прошу строго не судить и оказать посильную помощь )))
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Май 26, 2011, 13:08 »

Поток не выходит из run, поэтому по повторному start ничего не происходит.
Записан
Mark_T
Гость
« Ответ #2 : Май 27, 2011, 13:12 »

Третий день ломаю голову, пытался и через exit и через wait, не получается. Может, кто напишет готовый код. Был бы очень благодарен. Притом, хотелось бы получить код и для завершения потока (переконекта) и для получения сигнала ошибок. Заранее благодарен.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Май 28, 2011, 03:18 »

Выкиньте поток.
Записан
Mark_T
Гость
« Ответ #4 : Май 30, 2011, 12:23 »

   Оъявляю теперь поток через mTread=new Thread().Глушу поток через delete() . Проблема в том, что теперь сигнал readyRead вызывается только при попытке что то записать в сокет. То есть если мне что-то пришло, то получу я  это  только после попытки записи. В однопоточном приложении все пучком.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #5 : Май 30, 2011, 14:33 »

Невидя нового кода трудно что-то советовать, но попробуйте принудительно поставить Qt::QueuedConnection для этого сигнала.
Записан
ddrtn
Гость
« Ответ #6 : Июнь 01, 2011, 14:30 »

Передавать указатель на сокет в поток нехорошо. лучше передать туда дескриптор сокета. а там уже создать новый объект класса QTcpSocket и передать ему этот дескриптоы (setSocketDescriptor). Единственно, если Вы получаете указатели на сокеты от QTcpServer, то в этом случае лучше отказаться от newConnection ()/nextPendingConnection () и в наследнике от QTcpServer переписать incomingConnection
Записан
Mark_T
Гость
« Ответ #7 : Июнь 01, 2011, 20:41 »

ух ты, тепреь осталось это все обдумать и реализовать. Спасибо огромное!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.15 секунд. Запросов: 23.