crossplatform.ru

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

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> QThread не прекращает работу(((, QThread
silver47
  опции профиля:
сообщение 7.10.2011, 18:18
Сообщение #11


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

Группа: Участник
Сообщений: 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 килобайт ) Кол-во скачиваний: 70
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fortero
  опции профиля:
сообщение 8.10.2011, 13:32
Сообщение #12


Участник
**

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

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




Репутация:   0  


Всем спасибо разобрался!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sidsukana
  опции профиля:
сообщение 7.11.2011, 22:09
Сообщение #13


Участник
**

Группа: Участник
Сообщений: 158
Регистрация: 23.12.2010
Из: Челябинск
Пользователь №: 2296

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




Репутация:   2  


Сделал все как сказано. В конструкторе инициализация сокета. В run() Добавил waitForDisconnect(). Почему при не получается удалить поток?

Тут slotTest срабатывает.
connect(thread, SIGNAL(finished()), this, SLOT(slotTest()));
Тут deleteLater нет. Или я чего то не понимаю и деструктор вызывается не сразу?
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));


Сообщение отредактировал sidsukana - 7.11.2011, 22:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_AK__*
сообщение 8.11.2011, 11:18
Сообщение #14





Гости








    


Простите, может немного не по теме, но имел очень печальный опыт Delphi+асинхронный сокет Windows: по UDP около 2000 пакетов/сек (по 10кБ каждый). Система просто ложилась. Переделал на синхронный прием в отдельном потоке - все забегало как надо. Кто-нибудь имеет опыт использования Qt-реализации "на сигналах" в подобных условиях (много пакетов в секунду)?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 8.11.2011, 15:54
Сообщение #15


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 17.2.2010
Из: Москва
Пользователь №: 1470

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




Репутация:   3  


Пардон, не всю тему прочитал.

А так если вернуться к началу, то можно что-то типа этого ))).

Пример 1. Завершение потока.

    class MyThread : public QThread
    {
        Q_OBJECT


    private:
        QAtomicInt run_flag;

    public:
        MyThread ( QObject * parent );
        virtual ~MyThread ();

    public slots:
        void begin ();
        void end ();

    protected:
        virtual void run ();
    };


    MyThread::MyThread ( QObject * parent )
        : QThread( parent )
        , run_flag( true )
    {
    };

    MyThread::~MyThread ()
    {
        end();
    };

    void MyThread::begin ()
    {
        run_flag.fetchAndStoreOrdered( true );
        start();
    };

    void MyThread::end ()
    {
        run_flag.fetchAndStoreOrdered( false );
        wait();
    };

    bool MyThread::isReady () const
    {
        return run_flag;
    };

    void MyThread::run ()
    {
        while ( run_flag )
        {
            // ...
        }
    };


Пример 2. Слушающий сокет в потоке (без наворотов).

QThread * thread = new QThread( parent );
QTcpSocket * socket = new QTcpSocket();

socket->moveToThread( thread );

// ... настройки, коннекты и т.д.

thread->start();


Не забыть удалить socket.

Сообщение отредактировал ssoft - 8.11.2011, 15:58
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Galaxycon_*
сообщение 17.4.2012, 14:07
Сообщение #16





Гости








    


Вот что смущает...
В переделанном примере (аттач threadedfortuneserver.zip )
Объект TcpSocket Создается в конструкторе.
И ему назначаются слоты нити, которая будет создана.
Но тогда TcpSocket будет не принадлежать потоку?
Может вернее его создавать все же в run()?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 28.1.2025, 21:40