Russian Qt Forum
Май 29, 2024, 14:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Завершнение QThread  (Прочитано 22084 раз)
zodiac
Гость
« : Ноябрь 07, 2008, 16:05 »

Привествую всех. Возникла большая проблемка с завершнением qthread, а затем с его повторным запуском. Имеется клиент джаббера и при смене статуса на оффлайн (точнее, когда пришло сообщение от либы о том, что нас отключили от сервера) поток должен завершаться (делаю это так: this->exit()Подмигивающий, но затем, если опять пробовать подключиться (сразу), то "this->isRunning()" выдает true. Как сделать так, чтобы как-то ждать. пока поток завершиться? Пробовал "connect(this, SIGNAL(finished()), this, SLOT(threadFinished()));", но оно как-то у меня не всегда рабатывает =|
Записан
vaprele07
Гость
« Ответ #1 : Ноябрь 07, 2008, 16:12 »

while (this->isRunning()) ; правда опасно  Шокированный
Записан
zodiac
Гость
« Ответ #2 : Ноябрь 07, 2008, 16:17 »

this->exit();
while (this->isRunning());
Вешает программу:)
Записан
BRE
Гость
« Ответ #3 : Ноябрь 07, 2008, 16:37 »

this->exit();
while (this->isRunning());
Вешает программу:)

Попробуй место: while (this->isRunning());
QThread::wait(...) использовать.
Записан
zodiac
Гость
« Ответ #4 : Ноябрь 07, 2008, 16:48 »

Что-то я не пойму как его использовать...
Записан
BRE
Гость
« Ответ #5 : Ноябрь 07, 2008, 17:04 »

Что-то я не пойму как его использовать...
Использовать так:
Код:
	exit();
wait();

А вот если на нем происходит завис, то желательно глянуть на код нити.

P.S. Да и желательно проверять код возврата, если false - то за указанное время нить так и не умерла.
« Последнее редактирование: Ноябрь 07, 2008, 17:12 от BRE » Записан
zodiac
Гость
« Ответ #6 : Ноябрь 07, 2008, 17:16 »

В первый раз это срабатывает нормально (после первого отключения), но во второй раз (после второго) уже идет ступор у него%)
Записан
BRE
Гость
« Ответ #7 : Ноябрь 07, 2008, 17:24 »

В первый раз это срабатывает нормально (после первого отключения), но во второй раз (после второго) уже идет ступор у него%)
А после рестарта нить нормально работает?
Получается, что нить второй раз не финиширует? Я правильно понимаю.
Записан
SASA
Гость
« Ответ #8 : Ноябрь 07, 2008, 17:41 »

Код:
while (thread->isRunning())
{
QCoreApplication::processEvents(QEventLoop::AllEvents);
}
А где ты делаешь exit(); wait(); и в каком потоке?
« Последнее редактирование: Ноябрь 07, 2008, 17:52 от SASA » Записан
zodiac
Гость
« Ответ #9 : Ноябрь 07, 2008, 17:42 »

В первый раз это срабатывает нормально (после первого отключения), но во второй раз (после второго) уже идет ступор у него%)
А после рестарта нить нормально работает?
Получается, что нить второй раз не финиширует? Я правильно понимаю.
Да, правильно. Работает и потом не финиширует.
Записан
zodiac
Гость
« Ответ #10 : Ноябрь 07, 2008, 17:58 »

Код:
while (thread->isRunning())
{
QCoreApplication::processEvents(QEventLoop::AllEvents);
}
А где ты делаешь exit(); wait(); и в каком потоке?
Эмс... а откуда цикл вызывать?
Делаю при вызове "void jProtocol::onDisconnect(ConnectionError e)". В этом потоке, который нужно завершить.
Записан
zodiac
Гость
« Ответ #11 : Ноябрь 07, 2008, 18:04 »

Так. с обычным отключением сейчас все в порядке (вроде). Осталась проблема в либе..
Записан
BRE
Гость
« Ответ #12 : Ноябрь 07, 2008, 18:20 »

Так. с обычным отключением сейчас все в порядке (вроде). Осталась проблема в либе..
Набросал тестовый класс, вроде все ок.
Все приводить не буду, только класс Thread
thread.h
Код:
#ifndef THREAD_H
#define THREAD_H

#include <QThread>

class Thread : public QThread
{
    Q_OBJECT
public:
    Thread( QObject *parent );

    void    run();

public slots:
    void    connectReady();
    void    connectLost();

signals:
    void    alive();
};

#endif // THREAD_H

thread.cpp
Код:
#include "thread.h"
#include <QTimer>

Thread::Thread( QObject *parent ) :
    QThread( parent )
{
}

void Thread::run()
{
    QTimer tm;
    tm.setSingleShot( false );
    connect( &tm, SIGNAL( timeout() ), this, SIGNAL( alive() ) );

    tm.start( 200 );

    exec();
}

void Thread::connectReady()
{
    start();
}

void Thread::connectLost()
{
    exit();
    wait();
}

Что за проблемы в либе?
Записан
zodiac
Гость
« Ответ #13 : Ноябрь 07, 2008, 18:48 »

Вот мое:
Код:
void jProtocol::onDisconnect(ConnectionError e)
{
qDebug() << "exit";
TreeModelItem item;
item.m_protocol_name = "Jabber";
item.m_account_name = m_account_name;
item.m_item_type = 2;
if(e != ConnUserDisconnected && e != ConnNotConnected)
{
QString error_tr;
switch(e)
{
---тут ошибки и установка error_tr---
}
emit systemNotification(m_account_name,error_tr);
}
m_jabber_account->getPluginSystem().setAccountIsOnline(item, false);
m_jabber_roster->setOffline();
emit setRealStatus(Presence::Unavailable);
---Тут поток должен завершаться---
}
когда e == ConnUserDisconnected, то все нормально, если нет, то ненормально. Хотя "exit" выводит во всех случаях. Вот я и думаю мож чего в либе..
Записан
BRE
Гость
« Ответ #14 : Ноябрь 07, 2008, 19:36 »

когда e == ConnUserDisconnected, то все нормально, если нет, то ненормально. Хотя "exit" выводит во всех случаях. Вот я и думаю мож чего в либе..
Без рабочего кода трудно что-то проверить, я бы на твоем месте начал комментировать по частям и смотреть из-за чего конкретно это происходит.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.13 секунд. Запросов: 17.