Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Mark_T от Май 26, 2011, 12:48



Название: передача указателя на сокет в поток
Отправлено: 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)));
А также в том, что при дисконекте и повторном нажатии на кнопку коннект не инициализируется.
Многопоточное приложение пишу впервые, прошу строго не судить и оказать посильную помощь )))


Название: Re: передача указателя на сокет в поток
Отправлено: LisandreL от Май 26, 2011, 13:08
Поток не выходит из run, поэтому по повторному start ничего не происходит.


Название: Re: передача указателя на сокет в поток
Отправлено: Mark_T от Май 27, 2011, 13:12
Третий день ломаю голову, пытался и через exit и через wait, не получается. Может, кто напишет готовый код. Был бы очень благодарен. Притом, хотелось бы получить код и для завершения потока (переконекта) и для получения сигнала ошибок. Заранее благодарен.


Название: Re: передача указателя на сокет в поток
Отправлено: Авварон от Май 28, 2011, 03:18
Выкиньте поток.


Название: Re: передача указателя на сокет в поток
Отправлено: Mark_T от Май 30, 2011, 12:23
   Оъявляю теперь поток через mTread=new Thread().Глушу поток через delete() . Проблема в том, что теперь сигнал readyRead вызывается только при попытке что то записать в сокет. То есть если мне что-то пришло, то получу я  это  только после попытки записи. В однопоточном приложении все пучком.


Название: Re: передача указателя на сокет в поток
Отправлено: LisandreL от Май 30, 2011, 14:33
Невидя нового кода трудно что-то советовать, но попробуйте принудительно поставить Qt::QueuedConnection для этого сигнала.


Название: Re: передача указателя на сокет в поток
Отправлено: ddrtn от Июнь 01, 2011, 14:30
Передавать указатель на сокет в поток нехорошо. лучше передать туда дескриптор сокета. а там уже создать новый объект класса QTcpSocket и передать ему этот дескриптоы (setSocketDescriptor). Единственно, если Вы получаете указатели на сокеты от QTcpServer, то в этом случае лучше отказаться от newConnection ()/nextPendingConnection () и в наследнике от QTcpServer переписать incomingConnection


Название: Re: передача указателя на сокет в поток
Отправлено: Mark_T от Июнь 01, 2011, 20:41
ух ты, тепреь осталось это все обдумать и реализовать. Спасибо огромное!