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
  опции профиля:
сообщение 6.10.2011, 17:37
Сообщение #2


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

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

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




Репутация:   6  


Если вы делаете цикл типа:
while(someBoolVariable){
    doSomeWork();
}
то тогда не вижу смысла заворачивать все это в класс, унаследованный от QThread. Запустите это в отдельном потоке через QtConcurrent::run. Для этого создайте у нужного Вам класса метод, назовем его для простоты myBackgroundWork и вызовем его:
void MyClass::someSlotToStartMyBackgroundWork(){
    QFuture<void> f1 = QtConcurrent::run(this, &MyClass::myBackGroundWork);
}

void MyClass::myBackGroundWork(){
  doYourVeryLongJobHere();
}


Если же Вы оборачиваете все это в QThread, то будьте любезны - используйте метод exec() для запуска цикла обработчика событий, и используйте класс так, как будто это программа от начала и до конца. Например так:
// некоторое место в вашей программе, где Вы решаете запустить поток
myThread = new MyThread;
myThread->start();

// место в Вашей программе, где Вы решили, что пора прикончить поток
myThread->quit(); // шлем сигнал завершения программы
if(QThreadPool::globalInstance()->activeThreadCount()) QThreadPool::globalInstance()->waitForDone();  // ждем завершения всех потоков

// сам класс, унаследованный от QThread
конструктор - какой Вам требуется
void MyThread::run(){ // метод запускающий поток на выполнение
  //или делаем рассчет и выходим или создаем в потоке объекты, связываем их сигналами - слотами и запускаем цикл обработки событий так:
  exec(); // поток будет крутиться до тех пор пока не получит сигнал на завершение
}


Что Вам необходимо сделать в потоке?

Сообщение отредактировал silver47 - 6.10.2011, 17:38
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- 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:21