crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
crashsp
  опции профиля:
сообщение 29.1.2012, 11:15
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 56
Регистрация: 23.10.2010
Пользователь №: 2144

Спасибо сказали: 8 раз(а)




Репутация:   546  


Доброго времени суток. Есть приложение многопоточный сервер , имеются принципиальные ошибки при межпотоковом взаимодействии , много тем поднято повсюду , но к сожелению мозг не черта не понял ((( ... пжл помогите решить.
Задача которую хочу решить сначала : после отключения сокета от хоста , удалить его , остановить поток , удалить поток

Вообщем выглядит так, есть свой класс QThread :
WorkerThread.h
Раскрывающийся текст
class WorkerThread : public QThread
{
    Q_OBJECT
public:
    WorkerThread(int socketDescriptor,QObject *parent = 0);
    ~WorkerThread();
protected:
    void run();
public slots:
    void onDisconnect();
    void displayError(QAbstractSocket::SocketError error);
signals:
    void disconnect();
private:
    QTcpSocket *m_client;
    int m_socketDescriptor;
};



WorkerThread.cpp
Раскрывающийся текст
void WorkerThread::run(){
    qDebug()<<"Start new thread";
    m_client = new QTcpSocket();
    if(!m_client->setSocketDescriptor(m_socketDescriptor)){
        qDebug()<<QString::number(m_socketDescriptor)+":!!!!!!ERROR socket: " + m_client->errorString();
        return;
    }
    
   //В слоте хочу сокет поставить на удаление
   // Какой тип соединения должен быть и почему?
    connect(m_client,SIGNAL(disconnected()),this,SLOT(onDisconnect()), ???????);


  // В этой функции выполняются манипуляции с сокетом m_client
  // Что то мне подсказывает что так нельзя делать, если так, какие пути решения ?
    processConnection(var2, var1);

    m_client->disconnectFromHost();

    exec();

    qDebug()<<"Вышел из run";
}

void WorkerThread::onDisconnect(){
   qDebug()<<"Закрыл сокет , пытаюсь удалить";
   m_client->deleteLater();
   qDebug()<<"Сокет поставлен в очередь на удаление";
   quit();
}

bool WorkerThread::processConnection(quint32 v, quint32 d){
    ....
       // Выполняется манипуляции с сокетом m_client
    ....
}


Server.cpp
Раскрывающийся текст
void Server::incomingConnection(int socketDescriptor){
    qDebug()<<"Incoming connection , socket"<<socketDescriptor;

        WorkerThread *thread = new WorkerThread(socketDescriptor,this);
        
        connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()), ????????);
        
        thread->start();
        
}


Сообщение отредактировал crashsp - 29.1.2012, 11:18
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 21.6.2025, 1:18