crossplatform.ru

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

> QThread не прекращает работу(((, QThread
fortero
  опции профиля:
сообщение 6.10.2011, 13:49
Сообщение #1


Участник
**

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

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




Репутация:   0  


Господа специалисты, подскажите как быть с QThread как бы всё работает но при закрытии последнего окна виджета программа висит, тред дальше пашет...
Подскажите где я ошибся:
#include <QtGui>
#include "firstclass.h"
#include "secondclass.h"

int main(int argc, char** argv){
    QApplication app(argc, argv);
    
    SecondClass Sc;
    Sc.start();
    FirstClass Fc;
    Fc.show();
    
    app.connect(&app, SIGNAL(lastWindowClosed()), &Sc, SLOT(stop()));    
    
    return app.exec();
}


secondclass.cpp
#include "secondclass.h"

SecondClass::SecondClass() : QThread(){
    st=false;
}

void SecondClass::run(){
    
    while(st!=true){
        qDebug() << "YES";
    }
        
}

void SecondClass::stop(){
    st=true;
}


Спасибо за внимание!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
silver47
  опции профиля:
сообщение 7.10.2011, 18:18
Сообщение #2


Активный участник
***

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

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




Репутация:   6  


С Qt идет пример Thread Fortune Server, но его особенность такова:
входящее соединение -> создается поток, поток делает свою работу по списку последовательно и завершается
Вы внесли изменение, воткнули цикл forever в поток. Это не есть верно.
посмотрим на то, что содержит реализация потока сервера. Она состоит из конструктора класса и метода run:
// конструктор - реально не делает ничего кроме инициализации.
FortuneThread::FortuneThread(int socketDescriptor, const QString &fortune, QObject *parent)
    : QThread(parent), socketDescriptor(socketDescriptor), text(fortune){}
// метод run - создает объект сокета, шлет ответ и уничтожает все за собой.
void FortuneThread::run(){
    QTcpSocket tcpSocket;
    if (!tcpSocket.setSocketDescriptor(socketDescriptor)) {
        emit error(tcpSocket.error());
        return;
    }

    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);
    out << (quint16)0;
    out << text;
    out.device()->seek(0);
    out << (quint16)(block.size() - sizeof(quint16));

    tcpSocket.write(block);
    tcpSocket.disconnectFromHost();
    tcpSocket.waitForDisconnected();
}


Что поменять?
Логично, что сокет нужно создавать в конструкторе и не на стеке а на куче т.е так:
socket = new QTcpSocket(this);

Соединить необходимые сигналы... здесь конкретно самым необходимым будет socket::readyRead(), который сообщает о том что данные в сокет просочились.
А в методе run достаточно будет лишь запустить обработчик событий:
exec();


В догонку измененный текст QThreadFortune Server. Теперь он создает сокет, и молчит, при получении данных вываливает их в дебаг. Висит до тех пор пока клиент не отключиться. Ждет подключения на любом адресе на порту пять пятерок При подключении с локалхоста так и указывайте в терминале localhost:55555


Сообщение отредактировал silver47 - 7.10.2011, 18:42
Прикрепленные файлы
Прикрепленный файл  threadedfortuneserver.zip ( 9,98 килобайт ) Кол-во скачиваний: 71
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- fortero   QThread не прекращает работу(((   6.10.2011, 13:49
- - silver47   Неверно используете поток.   6.10.2011, 14:01
- - fortero   Покажите как надо... А то я только такого типа при...   6.10.2011, 15:09
- - RazrFalcon   thread->quite();   6.10.2011, 15:49
- - fortero   Не получается всёравно весит! Покажите пожалу...   6.10.2011, 15:59
- - silver47   Если вы делаете цикл типа: while(someBoolVaria...   6.10.2011, 17:37
- - fortero   Спасибо попробую. Цитата(silver47 @ 6.10.201...   6.10.2011, 20:49
- - fortero   Ребят, я что то не догоняю или совсем тупой. Пожал...   6.10.2011, 21:53
- - silver47   Сокеты нужно слушать не в постоянном цикле, а запу...   7.10.2011, 4:00
- - fortero   Цитата(silver47 @ 7.10.2011, 4:00) Сокеты...   7.10.2011, 14:23
|- - ssoft   Пардон, не всю тему прочитал. А так если вернутьс...   8.11.2011, 15:54
- - silver47   С Qt идет пример Thread Fortune Server, но его осо...   7.10.2011, 18:18
- - fortero   Всем спасибо разобрался!   8.10.2011, 13:32
- - sidsukana   Сделал все как сказано. В конструкторе инициализац...   7.11.2011, 22:09
- - Гость_AK_   Простите, может немного не по теме, но имел очень ...   8.11.2011, 11:18
- - Galaxycon   Вот что смущает... В переделанном примере (аттач ...   17.4.2012, 14:07


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


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




RSS Текстовая версия Сейчас: 30.1.2025, 7:12