crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Остановка потока
AD
  опции профиля:
сообщение 18.8.2009, 16:50
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Есть какой-то код в потоке:
/// Класс параллельного потока для чтения лог-файлов
class RThread: public QThread
{
    Q_OBJECT

// ...........................

private:
    volatile bool stopped;            ///< переменная, контролирующая начало и конец выполнения потока

protected:
    virtual void run();

public:
        void stop() { stopped = true; }
};

void RThread::run()
{
// ..............................
    exec();
}

/// Остановка дополнительного потока
void RThread::stop() { stopped = true; }


В главном потоке хочу остановить
/// Загрузка одного файла
bool TLV::loadFile()
{
    bool result = false;
    if(threadRFile -> isRunning())
    {
        threadRFile -> stop();            ///< oстановка дополнительного потока
        threadRFile -> quit();
        delThread();
        result = readFile();
        visible_tracks = true;
    }
    else
    {
                      /// any
    }
    update();
    return result;
}

По какой-то причине если вызывать функцию quit() программа валится, говоря что какой-то внутренний, в Qt, мьютекс не разблокирован. Как поправить ошибку?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 18.8.2009, 16:56
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Не увидел на что влияет stopped.
Попробуй добавить wait, для того что-бы убедиться что нить завершилась.

/// Загрузка одного файла
bool TLV::loadFile()
{
    bool result = false;
    if(threadRFile -> isRunning())
    {
        threadRFile -> stop();
        threadRFile -> quit();

        threadRFile -> wait();

        delThread();
        result = readFile();
        visible_tracks = true;
    }
    else
    {
                      /// any
    }
    update();
    return result;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 18.8.2009, 17:11
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Спасибо. Помогло! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 26.12.2024, 19:35