crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Работа с потоками
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
kuler Дата 4.2.2009, 11:40
  может туплю, но не вижу где в write посылается сигнал.
zayac_val Дата 3.2.2009, 20:38
  В моем клиент-серверном приложении, сокет(клиента) я создал в основном потоке, при коннекте к серверу в нем создается дочерний поток в котором создается сокет, предназначенный для общения с сокетом из основного потока. Проблема как обмениваться сигналами между потоками. Т.е. когда один сокет вызывает функцию write(), другой сокет сигнал readyRead не получает.
Litkevich Yuriy Дата 30.1.2009, 20:51
  Почитай эту тему, там и про сокеты и про потоки
zayac_val Дата 30.1.2009, 20:05
  Помогите разобраться с потоками.
Хочу написать клиент-серверное приложение, и по задумке каждый вновь создаваемый сокет должен работать в отдельном потоке. Работа потока начинается с выполнения функции run(), в котрой я и создаю свой сокет:
CODE

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.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 14:42