Работа с потоками

Модератор: Модераторы разделов

zayac_val
Сообщения: 38
ОС: openSuse10.3

Работа с потоками

Сообщение zayac_val »

Помогите разобраться с потоками.
Хочу написать клиент-серверное приложение, и по задумке каждый вновь создаваемый сокет должен работать в отдельном потоке. Работа потока начинается с выполнения функции run(), в котрой я и создаю свой сокет:

Код: Выделить всё

class Socket : public QTcpSocket
{
  Q_OBJECT
public:
   ClientServer *window;
   Socket(int sockDeskr,QObject *parent);
public slots:
   void read();
   void read_error();
   void deleteLater();
   void write();

};

class Thread : public QThread
{
  Q_OBJECT
public:
  ClientServer *window;
  Thread(int sockDeskr,QObject *parent);
  void run();
private:
   int sockDeskr;
};

Socket::Socket(int sockDeskr,QObject *parent):QTcpSocket(parent)
{
    window=(ClientServer *)parent;
     this->setSocketDeskriptor(sockDeskr);
  connect(this,SIGNAL(readyRead()),this,SLOT(read()));
  connect(this,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(read_error()));
  connect(window->pushButton_3,SIGNAL(clicked()),this,SLOT(write()));
}

 void Socket::read()
{
  QByteArray bar=this->readAll();
          QString str;
          str.append(bar);
          window->textEdit->setText(str);
}

void Socket::read_error()
{
  QMessageBox *mb=new QMessageBox(this);
          mb->setText(codec->toUnicode("Ошибка сокета: ")+this->errorString());
          mb->exec();
}

void Socket::write()
{
  QByteArray bar;
  bar.append(window->textEdit->toPlainText());
  this->write(bar);
}

/////////////////////////////////////////////////////////<-----------Thread-------->/////////////////////////
void Thread::Thread(int sockDeskr,QObject *parent)
{
  this->sockDeskr=sockDeskr;
  window=(ClientServer *)parent;
}

void Thread::run()
{
 Socket *soc=new Socket(sockDeskr,window);
}

Подскажите сокет при такой реализации будет работать в отдельном потоке, или я в потоке просто создаю экземпляр сокета и не более, и для правильной работы мне надо реализовывать слоты для сокета в классе Thread.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Работа с потоками

Сообщение RasenHerz »

все должно работать в разных потоках.
Спасибо сказали:
zayac_val
Сообщения: 38
ОС: openSuse10.3

Re: Работа с потоками

Сообщение zayac_val »

В моем клиент-серверном приложении, сокет(клиента) я создал в основном потоке, при коннекте к серверу в нем создается дочерний поток в котором создается сокет, предназначенный для общения с сокетом из основного потока. Проблема как обмениваться сигналами между потоками. Т.е. когда один сокет вызывает функцию write(), другой сокет сигнал readyRead не получает.
Спасибо сказали:
CapCom
Сообщения: 6
ОС: Slackware + Crunchbang

Re: Работа с потоками

Сообщение CapCom »

Как-то все запутано.

Возможно, проблема в том, что у отдельного потока с сокетом не запущен цикл обработки сообщений, как следствие - он не может принимать сигналы. Чуть подробнее об этом здесь: http://doc.trolltech.com/4.4/threads.html#...read-event-loop
Если коротко, то после создания сокета и установки связей сигналов со слотами надо вызвать в функции run() потока метод exec() ( http://doc.trolltech.com/4.4/qthread.html#exec ), который запустит цикл обработки сообщений.
Чтобы остановить цикл обработки сообщений используется quit() ( http://doc.trolltech.com/4.4/qthread.html#quit ).
Спасибо сказали:
zayac_val
Сообщения: 38
ОС: openSuse10.3

Re: Работа с потоками

Сообщение zayac_val »

Спасибо CapCom, прямо в точку.
Спасибо сказали: