crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> 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, 14:01
Сообщение #2


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

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

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




Репутация:   6  


Неверно используете поток.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fortero
  опции профиля:
сообщение 6.10.2011, 15:09
Сообщение #3


Участник
**

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

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




Репутация:   0  


Покажите как надо... А то я только такого типа примеры нашёл....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 6.10.2011, 15:49
Сообщение #4


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


thread->quite();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fortero
  опции профиля:
сообщение 6.10.2011, 15:59
Сообщение #5


Участник
**

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

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




Репутация:   0  


Не получается всёравно весит!

Покажите пожалуйста рабочий сампл, очень надо, пожалуйста.

Сообщение отредактировал fortero - 6.10.2011, 16:01
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 6.10.2011, 17:37
Сообщение #6


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

Группа: Участник
Сообщений: 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
  опции профиля:
сообщение 6.10.2011, 20:49
Сообщение #7


Участник
**

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

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




Репутация:   0  


Спасибо попробую.

Цитата(silver47 @ 6.10.2011, 17:37) *
............

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


Сокеты слушать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fortero
  опции профиля:
сообщение 6.10.2011, 21:53
Сообщение #8


Участник
**

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

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




Репутация:   0  


Ребят, я что то не догоняю или совсем тупой.
Пожалуйста помогите мне…
Начал разбираться дальше не получается, хоть убей…
Потом курил маны, вышло вот, что:
main.cpp
#include <QtGui>
#include <QTextCodec>

#include "firstclass.h"
#include "secondclass.h"

int main(int argc, char** argv){
    QApplication app(argc, argv);
    
    QTextCodec *codec =  QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForTr(codec);
    QTextCodec::setCodecForCStrings(codec);
    
    FirstClass Fc; //Это просто маленькое окошко унаследованное от QWidget
    SecondClass *Sc = new SecondClass; //Тред собственной персоны (в перспективе там будет сетевой сокет жить)
    Sc->start();
    
    app.connect( &app, SIGNAL( lastWindowClosed()), Sc, SLOT(stop()));
    
    Fc.show();
    
    return app.exec();
}


secondclass.h
#ifndef __SECONDCLASS_H__
#define __SECONDCLASS_H__

#include <QtNetwork>
#include <QtCore>
#include <QtGui>

class SecondClass : public QThread {
    Q_OBJECT
public:
    SecondClass();
    
private:
    void run();
    volatile bool st;
    
    
public slots:
    void stop();
    
};

#endif // __SECONDCLASS_H__


secondclass.cpp
#include "secondclass.h"

SecondClass::SecondClass() : QThread() {
    st=false;
    
}

void SecondClass::run(){

    while(!st){
        qDebug() << "Yes!!!";
    }
    
}

void SecondClass::stop(){
    st=true;
    terminate();
    wait();
}


Теперь вроде как работает, но если верить оф. ману, то это опасный вариант - terminate();
В режиме релиза работает вроде чётко!
А вот в отладке секунд 10 дуплится и потом вроде бы как срабатывает, так и должно быть или где то я на бокапорил?
Покажите пожалуйста действующую модель кода, не схему а именно копипаст а то я не могу раскурить не как эту тему!
Спасибо!

Сообщение отредактировал fortero - 6.10.2011, 21:54
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 7.10.2011, 4:00
Сообщение #9


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

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

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




Репутация:   6  


Сокеты нужно слушать не в постоянном цикле, а запустить цикл обработчика событий... а дальше на сигналах - слотах.
Создание сокета и его запуск:
void Server::incomingConnection(int socketDescriptor){        
    // создаем отдельный поток на каждое клиентское подключение      
    ServerThread *thread = new ServerThread(socketDescriptor);
    QObject::connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));            
    thread->start();
}


сам поток:
ServerThread::ServerThread(QObject *parent) : QThread(parent), socketDescriptor(socketDescriptor){
    socket = new QSslSocket;
    //-----------------
    // Signals & Slots
    //-----------------
    QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
    QObject::connect(socket, SIGNAL(encrypted()), this, SLOT(encrypted()));
    QObject::connect(socket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(sslErrors(QList<QSslError>)));
    QObject::connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()));
    QObject::connect(socket, SIGNAL(connected()), this, SLOT(connected()));
    QObject::connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error(QAbstractSocket::SocketError)));

    if(socket->setSocketDescriptor(socketDescriptor)){
       //qDebug() << "  sslSocket mode: " << (int)sslSocket.mode();
       //qDebug() << "  sslSocket state:" << (int)sslSocket.state();

       //qDebug() << "Calling sslSocket->startServerEncryption()";
       socket->startServerEncryption();
    }
    else {
        //qDebug() << "Couldn't setSocketDescriptor(" << socketDescriptor << ") for this connection";
        return;
    }
}
void ServerThread::run(){
    this->exec();
}



Сообщение отредактировал silver47 - 7.10.2011, 4:07
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fortero
  опции профиля:
сообщение 7.10.2011, 14:23
Сообщение #10


Участник
**

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

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




Репутация:   0  


Цитата(silver47 @ 7.10.2011, 4:00) *
Сокеты нужно слушать не в постоянном цикле, а запустить цикл обработчика событий... а дальше на сигналах - слотах.
Создание сокета и его запуск:
.....................


Спасибо огромное!
Я понимаю я наверное прошу многое, но Вы не могли написать готовый рабочий пример сокетов в отдельном потоке даже без шифрования.
В этой теме я сильно плаваю, мне нужен готовый простейший, правильный пример что бы разобраться как, что работает...
Ещё раз огромное спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 24.4.2024, 13:12