crossplatform.ru

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


  Ответ в QThread - quit()
Введите ваше имя
Подтвердите код

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

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


Последние 10 сообщений [ в обратном порядке ]
SABROG Дата 26.10.2009, 13:11
 
Цитата(niXman @ 26.10.2009, 12:32) *
Жесткое убийство потоков, это не правильное решение.


Правильное/неправильное, а некоторые вещи могут подвесить поток навечно и до проверки флага дело никогда не дойдет.
niXman Дата 26.10.2009, 11:32
 
Цитата(SABROG @ 23.10.2009, 23:00) *
Как я понял за всё время существования потоков ничего кроме жестокого убийства потока и if (terminatedFlag) ничего не придумали?

Жесткое убийство потоков, это не правильное решение. Не данный момент, самое правильное решение, это if (terminatedFlag)
BRE Дата 26.10.2009, 10:46
  Для удобства можно инкапсулировать все в одном классе:
class ExitFlag
{
public:
    ExitFlag() : m_exit( false ) {}

    void    doExit()
    {
        QMutexLocker lock( m_mutex );
        m_exit = true;
    }
    
    bool isExit() const
    {
        QMutexLocker lock( m_mutex );
        return m_exit;
    }

    operator bool() const
    {
        return isExit();
    }

private:
    mutable QMutex    m_mutex;
    bool            m_exit;
};


использовать этот класс можно примерно так:
class Thread : public QThread
{

public slots:
    void    stop()
    {
        m_exitFlag.doExit();
    }

protected:
    virtual void run()
    {
        while( !m_exitFlag )
        {
            // Долгие вычисления
            if( m_exitFlag.isExit() )
                break;
            // Долгие вычисления
        }
    }

private:
    ExitFlag    m_exitFlag;
};


P.S. Набирал прямо здесь, могут быть опечатки. :)
rnd Дата 25.10.2009, 13:48
  Кстати, зачем спорить, на то чтобы понять запускает или нет - необходимо 10 сек:
qthread.cpp
int QThread::exec()
{
    Q_D(QThread);
    d->mutex.lock();
    d->data->quitNow = false;
    QEventLoop eventLoop;
    d->mutex.unlock();
    int returnCode = eventLoop.exec();
    return returnCode;
}
Litkevich Yuriy Дата 25.10.2009, 11:53
 
Цитата(Cergey @ 25.10.2009, 15:25) *
Кто прав???
Документация, exec() - запускает цикл обработки событий (тык)
Cergey Дата 25.10.2009, 11:25
 
Цитата(BRE @ 24.10.2009, 18:17) *
Цитата(AD @ 24.10.2009, 18:09) *
Да кстати, exec() никакие циклы не запускает - проверял!

Ты ошибаешься.

Кто прав???
rnd Дата 24.10.2009, 19:53
  AD, приведите минимальный пример
BRE Дата 24.10.2009, 17:17
 
Цитата(AD @ 24.10.2009, 18:09) *
Да кстати, exec() никакие циклы не запускает - проверял!

Ты ошибаешься.
AD Дата 24.10.2009, 17:09
 
Цитата(BRE @ 24.10.2009, 16:50) *
А что можно ввести? ;)
QEventLoop::exit (quit) и соответственно QThread::quit используют такой же подход со специальной переменной, при изменении которой цикл заканчивается.
В своих циклах нужно использовать свои переменные.

А почему это решение не нравиться?

Стоп.... Не пойму о каком еще цикле, который заканчивается, идет речь? Если нет своего цикла, то вообще в функцию run() задет раз и выйдет, все... О каком цикле идет речь, который заканчивается с помощью quit()? Да кстати, exec() никакие циклы не запускает - проверял!

Цитата(BRE @ 24.10.2009, 16:50) *
А почему это решение не нравиться?

Да почему, нормальное решение. Но уж очень какое-то искусственное!
Cergey Дата 24.10.2009, 16:24
  Всегда, если подумать, можно установить условие для выхода!!!

Создавал потоки и так и не понял зачем нужен exec() ( причем тут for ) и что такое event loop!!!
Объяесните кто может??? ;)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 11:58